zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

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];


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return (!self.searchController.active) ? self.items.count : self.searchResults.count; }
返回cell:
- (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在⽤户滚动时丢帧。