UISearchController 爬坑!! 希望对你有用!!

 UISearchController iOS 11之后searchController有了新样式,它可以放在导航栏!!

好吧!我们就玩这样的样式,也只能这样了! 

/*************先讨论放在导航栏*************/

1 创建一个UITableViewController文件作为点击后搜索列表页面

2 ios11 后放到导航栏之前放在表头

  if(@available(iOS11.0, *)) {

        self.navigationItem.searchController = self.SearchController;

    }else    { 

self.TableView.tableHeaderView=self.SearchController.searchBar;   

}

3 初始化

-(UISearchController*)SearchController

{    if (!_SearchController) {

        //检索页

        TableViewController *tab =[[TableViewController alloc]init];

        //数据数组

        tab.dataArray =self.dataArray;

        //初始化

        _SearchController =[[UISearchController alloc]initWithSearchResultsController:tab];

//searchResultsUpdater代理放到检索页去实现

        _SearchController.searchResultsUpdater=tab;

//SearchController.delegate代理放到当前页处理

        _SearchController.delegate=self;

        //搜索时,背景色

        _SearchController.dimsBackgroundDuringPresentation=NO;

           [_SearchController.searchBar sizeToFit];

 self.definesPresentationContext = YES;

  }    return _SearchController;

}

问题1. 一开始没有显示呀 为何列表拖动才出现 !


是的默认就是这样的! 解决方法:     //直接显示 ios11还有一条属性设置  self.navigationItem.hidesSearchBarWhenScrolling=NO;   问题又来了列表滚动我想它滚动隐藏,没错你又得设置回来-(void)viewDidAppear:(BOOL)animated

{    if(@available(iOS11.0, *)) {

        //显示后设置回来滚动隐藏    

    self.navigationItem.hidesSearchBarWhenScrolling=YES;    }

}

问题2. 我点击UISearchController 消失了  什么鬼! (特殊情况)

网上答案都是这个 没有添加  self.definesPresentationContext = YES; 上移动64dp  问题是已经添加了!图层不见上移!

原因:当前视图不是父视图 当前很多设计页面都是放在在 ScrollView 上 然后[self addChildViewController:ViewController]; 所以不应该放在当前视图,(self.definesPresentationContext = YES;)放在它的父视图中!


问题3.searchBar样式怎么设置? 一顿猛如虎的简单设置之后你会发现很多没效果!  ios11 已经属于系统创建的图层!

特殊处理: 

设置searchBar样子和颜色  思路:添加一张你想要的一样样式的图片给它.

      //添加一张白色的图片(方法自己上网搜索)

      UIImage *image =[UIImage imageWithColor:[UIColor whiteColor]];

        //把白色的图片弄成自己想要的样子(图片处理大小和切圆角,方法自己上网搜索)

        image =[UIImage createRoundedRectImage:image size:CGSizeMake(self.view.frame.size.width, 34) radius:34/2];;

       [_SearchController.searchBar setSearchFieldBackgroundImage:image forState:UIControlStateNormal];

        //设置文字和放大镜的偏移

      [_SearchController.searchBar setSearchTextPositionAdjustment:UIOffsetMake(10, 0)];


设置 输入文字大小颜色 (控件位置 默认情况是靠上的)!!

经过研究给个一劳永逸的方法!!

viewWillLayoutSubviews:控制器的view将要布局子控件 时候设置

- (void)viewWillLayoutSubviews {

    [super  viewWillLayoutSubviews];

//获取TextField

   UITextField*searchField = [_SearchController.searchBar valueForKey:@"_searchField"];

//设置到中间(和放到表头一样/动画不好)

    searchField.center=_SearchController.searchBar.center;

//设置字号和颜色

    searchField.font = [UIFont systemFontOfSize:12];

    searchField.textColor=[UIColor redColor];

    [searchFieldsetValue:[UIColor blueColor] forKeyPath:@"_placeholderLabel.textColor"];

    [searchFieldsetValue:[UIFont systemFontOfSize:12] forKeyPath:@"_placeholderLabel.font"];

}


最后取消按钮的设置  UISearchResultsUpdating 里面去处理(因为Button活动以后才有所以只能在检索时候设置)

- (void)updateSearchResultsForSearchController:(UISearchController*)searchController{

//这里是检索的

    self.navigationController.definesPresentationContext=YES;

    searchController.searchResultsController.view.hidden = NO;

    [searchController.searchBar setShowsCancelButton:YES animated:YES];

//kvo设置

    UIButton*cancelButton = [searchController.searchBarvalueForKey:@"_cancelButton"];

    //修改标题和标题颜色

   [cancelButtonsetTitle:@"取消" forState:UIControlStateNormal];

 cancelButton.titleLabel.font=[UIFont systemFontOfSize:12];

    //刷新表格  

//  [self.tableView reloadData];

}


/*************讨论放在表头************/ 

ios11之前就上面的代码直接运行


怎么做成ios11 一样呢! 先把颜色设置成导航颜色

_SearchController.searchBar.barTintColor=self.navigationController.navigationBar.barTintColor;

你会发现searchBar上下多了两条黑线!!!查看图层发现 一条是导航的黑线 一条是searchBar的黑线!


是的 我们就把这两条线也设置成这个颜色image

//(颜色转为image自己上网找)

[_SearchController.searchBar setBackgroundImage:[self  imageWithColor:self.navigationController.navigationBar.barTintColor]];


在方法下面区分下

  if(@available(iOS11.0, *)) {

        self.navigationItem.searchController = self.SearchController;

        //直接显示

        self.navigationItem.hidesSearchBarWhenScrolling=NO;

    }else

    {

        self.TableView.tableHeaderView=self.SearchController.searchBar;

        _SearchController.searchBar.barTintColor=self.navigationController.navigationBar.barTintColor;    

    [_SearchController.searchBar setBackgroundImage:[self  imageWithColor:self.navigationController.navigationBar.barTintColor]];

    }

最后就剩下导航线 要考虑到只能当前页面的样式,还有就是ios11之前才这样,所以两个条件

//视图将要显示时隐藏

-(void)viewWillAppear:(BOOL)animated

{

    [superviewWillAppear:animated];

       if(@available(iOS11.0, *)) {

       }else

       {

           [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];

           [self.navigationController.navigationBar setShadowImage:[UIImage new]];

       }

}

//视图将要消失时取消

-(void)viewWillDisappear:(BOOL)animated

{

    [super viewWillDisappear:animated];

      if(@available(iOS11.0, *)) {

      }else

      {

          [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];

          [self.navigationController.navigationBar setShadowImage:nil];

      }

}


好了基本一样了 对比下区别还是有一点点的 比较ios11 查看图层 searchBar 是顶置的 这样放在表头是居中的!!

!算了还是附赠方法吧免得到处找

+(UIImage*)imageWithColor:(UIColor*)color

{

    CGRectrect =CGRectMake(0.0f,0.0f,1.0f,1.0f);

    UIGraphicsBeginImageContext(rect.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, [color CGColor]);

    CGContextFillRect(context, rect);

    UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    returntheImage;

}

+(UIImage*)createRoundedRectImage:(UIImage*)image size:(CGSize)size radius:(NSInteger)radius

{

    // the size of CGContextRef

    intw = size.width;

    inth = size.height;


    UIImage*img = image;

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);

    CGRectrect =CGRectMake(0,0, w, h);


    CGContextBeginPath(context);

    addRoundedRectToPath(context, rect, radius, radius);

    CGContextClosePath(context);

    CGContextClip(context);

    CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage);

    CGImageRef imageMasked = CGBitmapContextCreateImage(context);

    img = [UIImageimageWithCGImage:imageMasked];


    CGContextRelease(context);

    CGColorSpaceRelease(colorSpace);

    CGImageRelease(imageMasked);

    return img;

}

static voidaddRoundedRectToPath(CGContextRefcontext,CGRectrect,floatovalWidth,

                                 floatovalHeight)

{

    floatfw, fh;


    if(ovalWidth ==0|| ovalHeight ==0)

    {

        CGContextAddRect(context, rect);

        return;

    }

    CGContextSaveGState(context);

    CGContextTranslateCTM(context, CGRectGetMinX(rect), CGRectGetMinY(rect));

    CGContextScaleCTM(context, ovalWidth, ovalHeight);

    fw =CGRectGetWidth(rect) / ovalWidth;

    fh =CGRectGetHeight(rect) / ovalHeight;


    CGContextMoveToPoint(context, fw, fh/2);  // Start at lower right corner

    CGContextAddArcToPoint(context, fw, fh, fw/2, fh,1);  // Top right corner

    CGContextAddArcToPoint(context,0, fh,0, fh/2,1);// Top left corner

    CGContextAddArcToPoint(context,0,0, fw/2,0,1);// Lower left corner

    CGContextAddArcToPoint(context, fw,0, fw, fh/2,1);// Back to lower right

    CGContextClosePath(context);

    CGContextRestoreGState(context);

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容