在这里就不细节的描述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
第一次写,全是干货,希望能帮助到大家,谢谢!