iOS中 UISearchController 搜索栏 UI技术分享
2023-09-27 14:26:37 时间
p style="margin-top: 0px; margin-bottom: 0px; font-size: 20px; font-family: STHeiti Light;" span UISearchController 继承自UIViewController /span /p p style="margin-top: 0px; margin-bottom: 0px; font-size: 20px; font-family: STHeiti Light;" span // 在iOS 8.0以上版本中, 我们可以使用UISearchController来非常方便地在UITableView中添加搜索框. 而在之前版本中, 我们还是必须使用UISearchBar + UISearchDisplayController的组合方式. /span /p
#import "SearchViewController.h" #define kTableCell @"tablecell" @interface SearchViewController () UISearchResultsUpdating @property(nonatomic,retain)NSMutableArray *items; @property(nonatomic,retain)UISearchController *searchController; @property(nonatomic,retain)NSMutableArray *searchResults;//接收数据源结果 @end
懒加载及释放
@implementation SearchViewController - (instancetype)init self = [super init]; if (self) { return self; //懒加载 - (NSMutableArray *)items{ if (!_items) { self.items = [NSMutableArray arrayWithCapacity:0]; return [[_items retain]autorelease]; //懒加载 - (NSMutableArray *)searchResults{ if (!_searchResults) { self.searchResults = [NSMutableArray arrayWithCapacity:0]; return [[_searchResults retain]autorelease]; - (void)dealloc self.items = nil; self.searchResults = nil; self.searchController = nil; [super dealloc]; }
- (void)viewDidLoad { [super viewDidLoad]; //导航栏 [self p_navigationController]; //调用初始化searchController [self setSearchControllerView]; //注册 [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:kTableCell]; }
初始化SearchController初始化
- (void)setSearchControllerView{ self.searchController = [[UISearchController alloc]initWithSearchResultsController:nil]; self.searchController.searchBar.frame = CGRectMake(0, 0, 0, 44); self.searchController.dimsBackgroundDuringPresentation = false; //搜索栏表头视图 self.tableView.tableHeaderView = self.searchController.searchBar; [self.searchController.searchBar sizeToFit]; //背景颜色 self.searchController.searchBar.backgroundColor = [UIColor orangeColor]; self.searchController.searchResultsUpdater = self;
//引入UISearchController之后, UITableView的内容也要做相应地变动: 即cell中要呈现的内容是items, 还是searchResults.这一点, 可以通过UISearchController的active属性来判断, 即判断输入框是否处于active状态. //UITableView相关的很多方法都要根据active来做判断:配置导航条
- (void)p_navigationController{ self.title = @"小韩哥-英雄列表"; self.items = @[@"国服第一臭豆腐 No.1 Stinky Tofu CN.", @"比尔吉沃特(Bill Ji walter)", @"瓦洛兰 Valoran", @"祖安 Zaun", @"德玛西亚 Demacia", @"诺克萨斯 Noxus", @"艾欧尼亚 Ionia", @"皮尔特沃夫 Piltover", @"弗雷尔卓德 Freijord", @"班德尔城 Bandle City", @"无畏先锋", @"战争学院 The Institute of War", @"巨神峰", @"雷瑟守备(JustThunder)", @"裁决之地(JustRule)", @"黑色玫瑰(Black Rose)", @"暗影岛(Shadow island)", @"钢铁烈阳(Steel fierce)", @"恕瑞玛沙漠 Shurima Desert", @"均衡教派(Balanced sect)", @"水晶之痕(Crystal Scar)", @"影流(Shadow Flow )", @"守望之海(The Watchtower of sea)", @"皮尔特沃夫", @"征服之海", @"扭曲丛林 Twisted Treeline", @"教育网专区", @"试炼之地 Proving Grounds", @"卡拉曼达 Kalamanda", @"蓝焰岛 Blue Flame Island", @"哀嚎沼泽 Howling Marsh", @"艾卡西亚 Icathia", @"铁脊山脉 Ironspike Mountains", @"库莽古丛林 Kumungu", @"洛克法 Lokfar", @"摩根小道 Morgon Pass", @"塔尔贡山脉 Mountain Targon", @"瘟疫丛林 Plague Jungles", @"盘蛇河 Serpentine River", @"厄尔提斯坦 Urtistan", @"巫毒之地 Voodoo Lands", @"咆哮深渊 Howling Abyss", @"熔岩洞窟 Magma Chambers", @"召唤师峡谷 Summoners Rift", @"九尾妖狐: 阿狸(Ahri)", @"暗影之拳:阿卡丽(Akali)", @"牛头酋长:阿利斯塔(Alistar)", @"殇之木乃伊:阿木木(Amumu)", @"冰晶凤凰:艾尼维亚(Anivia)", @"黑暗之女:安妮(Annie)", @"寒冰射手:艾希(Ashe)", @"蒸汽机器人:布里茨(Blitzcrank)", @"复仇焰魂:布兰德(Brand)", @"皮城女警:凯特琳(Caitlyn)", @"魔蛇之拥:卡西奥佩娅(Cassiopeia)", @"虚空恐惧:科’加斯(ChoGath)", @"英勇投弹手:库奇(Corki)", @"诺克萨斯之手:德莱厄斯(Darius)", @"皎月女神:黛安娜:(Diana)", @"祖安狂人:蒙多医生(DrMundo)", @"荣耀行刑官:德莱文(Delevin)", @"蜘蛛女皇:伊莉斯(Elise)", @"寡妇制造者:伊芙琳(Evelynn)", @"探险家:伊泽瑞尔(Ezreal)", @"末日使者:费德提克(Fiddlesticks)", @"无双剑姬:剑姬(Fiora)", @"潮汐海灵:菲兹(Fizz)", @"哨兵之殇:加里奥(Galio)", @"海洋之灾:普朗克(Gangplank)", @"德玛西亚之力:盖伦(Garen)", @"酒桶:古拉加斯(Gragas)", @"法外狂徒:格雷福斯(Graves)", @"战争之影:赫卡里姆 (Hecarim)", @"大发明家:黑默丁格(Heimerdinger)", @"刀锋意志:伊瑞利亚(Irelia)", @"风暴之怒:迦娜(Janna)", @"德玛西亚皇子:嘉文四世(JarvanⅣ)", @"武器大师:贾克斯(Jax)", @"未来守护者:杰斯(Jayce)", @"天启者:卡尔玛(Karma)", @"死亡颂唱者:卡尔萨斯(Karthus)", @"虚空行者:卡萨丁(Kassadin)", @"不详之刃:卡特琳娜(Katarina)", @"审判天使:凯尔(Kayle)", @"狂暴之心:凯南(Kennen)", @"虚空掠夺者:卡’兹克(Khazix)", @"深渊巨口:克格’莫(Kog Maw)", @"诡术妖姬:乐芙兰(LeBlanc)", @"盲僧:李青(Lee sin)", @"曙光女神:蕾欧娜(Leona)", @"仙灵女巫:璐璐(lulu)", @"光辉女郎:拉克丝(Lux)", @"熔岩巨兽:墨菲特(Malphite)", @"虚空先知:玛尔扎哈(Malzahar)", @"扭曲树精:茂凯(Maokai)", @"无极剑圣:易(Yi)", @"赏金猎人:厄运小姐(MissFortune)", @"齐天大圣:孙悟空(Monkey king)", @"金属大师:莫德凯撒(Mordekaiser)", @"堕天使:莫甘娜(Morgana)", @"唤潮鲛姬:娜美(Nami)", @"沙漠死神:内瑟斯(Nasus)", @"深海泰坦:诺提勒斯(Nautilus)", @"狂野女猎手:奈德丽(Nidalee)", @"永恒梦魇:魔腾(Nocturne)", @"雪人骑士:努努(Nunu)", @"狂战士:奥拉夫(Olaf)", @"发条魔灵:奥莉安娜(Orianna)", @"战争之王:潘森(Pantheon)", @"钢铁大使:波比(Poopy)", @"披甲龙龟:拉莫斯(Rammus)", @"荒漠屠夫:雷克顿(Renekton)", @"傲之追猎者:雷恩加尔(Rengar)", @"放逐之刃:瑞文(Rivan)", @"机械公敌:兰博(Rumble)", @"流浪法师:瑞兹(Ryze)", @"凛冬之怒:瑟庄妮:(Sejuani)", @"恶魔小丑:萨科(Shaco)", @"暮光之眼:慎(Shen)", @"龙血武姬:希瓦娜(Shyvana)", @"炼金术士:辛吉德(Singed)", @"亡灵勇士:赛恩(Sion)", @"战争女神:希维尔(Sivir)", @"水晶先锋:斯卡纳(Skarner)", @"琴瑟仙女:娑娜(Sona)", @"众星之子:索拉卡(Soraka)", @"策士统领:斯维因(Swain)", @"暗黑元首:辛德拉(Syndra)", @"刀锋之影:泰隆(Talon)", @"宝石骑士:塔里克(Taric)", @"迅捷斥候:提莫(Teemo)", @"魂锁典狱长:锤石(Thresh)", @"麦林炮手:崔丝塔娜(Tristana)", @"诅咒巨魔:特兰德尔(Trundle)", @"蛮族之王:泰达米尔(Tryndamere)", @"卡牌大师:崔斯特(Twisted Fate)", @"瘟疫之源:图奇(Twitch)", @"野兽之灵:乌迪尔(Udyr)", @"首领之傲:厄加特(Urgot)", @"惩戒之箭:韦鲁斯(Varus)", @"暗夜猎手:薇恩(Vayne)", @"邪恶小法师:维伽(Veigar)", @"皮城执法官:蔚(Vi)", @"机械先驱:维克托(Viktor)", @"猩红收割者:弗拉基米尔(Vladimir)", @"雷霆咆哮:沃利贝尔(Volibear)", @"嗜血猎手:沃里克(Warwick)", @"远古巫灵:泽拉斯(Xerath)", @"德邦总管:赵信(XinZhao)", @"掘墓者:约里克(Yorick)", @"影流之主:劫(Zed)", @"爆破鬼才:吉格斯(Ziggs)", @"时光守护者:基兰(Zilean)", @"荆棘之兴:婕拉(Zyra)"].mutableCopy;#pragma mark 协议中的方法
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController{ [self.searchResults removeAllObjects]; //NSPredicate 谓词 NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"self contains[cd] %@",searchController.searchBar.text]; self.searchResults = [[self.items filteredArrayUsingPredicate:searchPredicate]mutableCopy]; //刷新表格 [self.tableView reloadData];返回cell:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return (!self.searchController.active) ? self.items.count : self.searchResults.count; }- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kTableCell forIndexPath:indexPath]; if (cell == nil) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:kTableCell];业务代理返回高:
cell.imageView.frame = CGRectMake(60, 60, 10, 10); cell.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%ld",indexPath.row + 43]]; cell.textLabel.font = [UIFont systemFontOfSize:15]; cell.textLabel.text = (!self.searchController.active) ? self.items[indexPath.row] : self.searchResults[indexPath.row]; return cell; }- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ if (indexPath.row == 0) { return 100 ; }else{ return 80; }最终效果:
阿里云EMAS-专家测试服务iOS和Android上百种机型性能、兼容及UI等测试 阿里云EMAS测试专家有着集团内部多个日活过亿规模APP经验,提供EMAS专家测试,客户只需提交测试需求,从用例设计、脚本录制、海量机型测试、整理测试结果、48小时输出专家测试报告均由阿里云EMAS测试专家一站式服务完成。覆盖功能测试、深度兼容测试、性能测试、UI适配测试以及隐私合规检测等,帮助用户以更低成本获得高质量的全面测试能力,可用于APP正式发版前验收,规避手机APP上线前或发版过程中各类隐患。
iOS UI 自动化测试原理以及在 Trip.com 的应用实践 笔者入职 Trip.com 已满一年,回顾这一年的工作历程,约一半的时间都在做 UI 自动化测试相关内容。从而,笔者更深入地研究了 iOS 平台下的自动化测试技术,目前也在负责部门 App 自动化测试平台的搭建和维护。故想借这篇文章一并将所踩过的坑以及学习到的技术,系统且全面地整理出分享给大家。
flutter 在windows和linux上运行IOS UI模拟器 之前发视频总是有人留言,我用的什么模拟器,今天给大家说一下 我一般用的是device_preview这个插件,这个插件的闲置是只能做UI上的模拟,并没有真正的运行环境。 近似您的应用程序在另一台设备上的外观和性能。
如何优化iOS系统上的图文评论UI界面 在我们的社交 APP 上,⽤户的动态由精美的照⽚ 、视频和⽂字组成。对于每张照⽚和视频, 我 们都会展示出完整的标题和五个最新评论。由于⽤户喜欢使⽤标题来讲述照⽚背后的故事, 因此它们通常很⻓ 、很复杂, 并且可能包含超链 接和表情符号。渲染如此复杂的⽂本带来了⼀些问题, 它在滚动时造成性能下降。 即使在 iPhone 12 这样的新设备上, 复杂标题的初始⽂本绘制需要⻓达 50 毫秒, ⽽⽂本展示 需要⻓达 30 毫秒, 渲染速度很慢。⽂本问题还是简单问题, 有时我们需要加载更加复杂的图⽚甚⾄视频。所有这些步骤都发⽣在 UI 线程上, 导致app在⽤户滚动时丢帧。
相关文章
- iOS:一个Cell中设置另外一个Cell中的button
- iOS中ActionSheet和Alert的区别
- iOS 11开发教程(三)运行第一个iOS 11程序
- 《iOS 6高级开发手册(第4版)》——1.3节秘诀:检查设备接近度和电池状态
- iOS 系统字体设置加粗斜体
- 在iOS中使用Android中的.9图片
- iOS中常见的自定义宏
- iOS开发中各种关键字的区别
- iOS - ViewController生命周期
- SwiftUI iOS 开源组件之FlashCard旋转卡片slider(教程含源码)
- SwiftUI iOS 封装之SearchBar全功能封装实现多功能搜索功能(教程含源码)
- swift不同地方 命名空间module iOS
- IOS横竖屏控制与事件处理
- 《iOS应用软件设计之道》—— 第2章 画 草 图
- Unity 工具之 内嵌网页/浏览器 web view / browser 插件的整理大全(包括Window Mac Android iOS 等)
- 采用Fiddler建立Asp.net webapi与Android/IOS调试环境
- iOS--设置系统导航栏右上角按钮不显示问题
- iOS开发- stringByReplacingOccurrencesOfString不起作用的坑
- 如何获取IOS手机已安装app的bundleid
- iOS 9.3.3修复bug外"隐藏特征" 运行更快更流畅