美文网首页iOS学习ios开发整理程序员
iOS开发-搜索栏 UISearchController

iOS开发-搜索栏 UISearchController

作者: Kegem | 来源:发表于2017-03-16 12:13 被阅读1881次

    在这里就不细节的描述UISearchController的所有属性和方法了,主要提一下遇到的一些坑以及微信搜索框的实现方法之一:

    进入编辑状态时会出现偏移64点的问题,设置下面的属性即可:
    self.definesPresentationContext =YES;

    当然啦,加了这个后,当属性hidesNavigationBarDuringPresentation = YES时有人碰到搜索框进入编辑时向下偏移64的问题 ,设置 navigationBar 的 translucent属性即可,这个属性默认是NO,需要设置为YES:
    [self.navigationController.navigationBarsetTranslucent:YES];

    这样就完美解决了 。

    接下来说个实例,仿微信搜索框:

    大家都知道微信在拉人进群,选择的人会显示在搜索框的左侧,其实这个做法有很多种,我接下来我所实现的方法:
    不知道大家有没有仔细看UITextField的属性,它有一个leftView,就是那个放大镜,这个是可以自定义的
    拿到searchBar的TextField
    UITextField *searchField = [self.searchController.searchBarvalueForKey:@"_searchField"];
    可以先申明个属性保存这个放大镜,像微信那样在合适的时候换成放大镜
    self.lensView = searchField.leftView;
    我用的是UIColectionView来做leftView,UIColectionView的创建我这里就不说了,其实就是在合适的时候,放大镜和UIColectionView赋给leftView,在选择人的时候进行判断

    if (self.seleArray.count > 0) {
            searchField.leftView = self.collectionView;
        } else {
            searchField.leftView = self.lensView;
        }
    

    记得改变UICollectionView的宽。
    按照微信的显示,如果没选择人,进入编辑时要隐藏放大镜,退出编辑时要显示放大镜,这个可以在UISearchBarDelegate里进行设置:

    #pragma mark - UISearchBarDelegate
    - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
        //隐藏放大镜
        UITextField *searchField = [searchBar valueForKey:@"_searchField"];
        if (searchField.leftView == self.lensView) {
            [searchField setLeftViewMode:UITextFieldViewModeNever];
        } else {
            [searchField setLeftViewMode:UITextFieldViewModeAlways];
        }
    }
    
    - (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar {
        UITextField *searchField = [searchBar valueForKey:@"_searchField"];
        [searchField setLeftViewMode:UITextFieldViewModeAlways];
    }
    
    

    删除人和增加人就相当于删除和增加UICollectionView的cell,也很方便,但是我在这里遇到问题,就是UICollectionView作为leftView时,cell不能被选中,这个问题我没找到原因,实现微信点击cell删除功能,我是在cell上的UIImageView上设置点击手势,利用手势来达到点击cell的效果,如果大家有更好的实现方法,可以留言,谢谢!

    另外一个点就是放大镜默认居左显示问题,这个在网上有很多方法,具体就是建一个UISearchBar的分类,用一个属性来控制是居中还是居左显示,这里就不多做讲述了,直接上代码吧:
    h文件
    #import <UIKit/UIKit.h>
    
    @interface UISearchBar (LeftPlaceholer)
    
    //YES 居中
    //NO 靠左
    @property (nonatomic,assign,setter = setHasCenterdPlaceholder:)BOOL hasCenterdPlaceholder;
    
    @end
    
    m文件
    #import "UISearchBar+LeftPlaceholer.h"
    
    @implementation UISearchBar (LeftPlacdholer)
    @dynamic hasCenterdPlaceholder;
    - (void)setHasCenterdPlaceholder:(BOOL)hasCenterdPlaceholder {
        hasCenterdPlaceholder = hasCenterdPlaceholder;
        SEL centerSelector =NSSelectorFromString([NSStringstringWithFormat:@"%@%@",@"setCenter",@"Placeholder:"]);
        if ([selfrespondsToSelector:centerSelector]) {
            NSMethodSignature *signature = [[UISearchBarclass]instanceMethodSignatureForSelector:centerSelector];
            NSInvocation *invocation = [NSInvocationinvocationWithMethodSignature:signature];
            [invocation setTarget:self];
            [invocation setSelector:centerSelector];
            [invocation setArgument:&hasCenterdPlaceholderatIndex:2];
            [invocation invoke];
        }
    }
    
    @end
    

    第一次写,全是干货,希望能帮助到大家,谢谢!

    效果图:

    仿微信搜索框效果.gif

    相关文章

      网友评论

      • Mrallen_Hong:你好,我想问下,当用户未输入搜索字符串时,勾选了下面的用户,搜索栏出现用户头像,那我们怎么监听到键盘上的delete键事件呢..用来点击delete键删除选择的用户.
      • Ming_06c0:请问下, collectionView 的大小和位置怎么调整
      • willies:你好,能否提供一下Demo呢?
        Kegem:@Ming_06c0 暂时没有时间来专门写一个demo ,如果有什么问题可以问我的
        Ming_06c0:博主,有没有Demo能不能分享下?谢谢🙏
        Kegem:额、、你是想要那个取消按钮的隐藏方法吗?因为暂时没时间去写这个demo,如果有什么问题可以直接问我的 。
      • 可儿家族:三个全看了,IOS的不管有没有用先记下来看看。

      本文标题:iOS开发-搜索栏 UISearchController

      本文链接:https://www.haomeiwen.com/subject/elwdnttx.html