1.搜索框的基本信息
搜索框的 “基本属性+代理方法+应用”参考如下链接
1.关于UISearchBar, 看这个就够了:https://www.jianshu.com/p/328330e88be6
2.属性、方法详解及应用(自定义搜索框样式):https://www.jianshu.com/p/7e49a1c656e7
3.改变搜索图标和占位符坐标:https://www.jianshu.com/p/0756aba082fc
4.导航栏上加搜索:https://www.jianshu.com/p/1a5d8bf6d906
- 备注:做搜索的时候,记得搜索之前要先清空装数据的数组
2.系统搜索框的demo演示
- 效果图:
- 代码:
- 核心代码之控件创建
- (UIView *)searchView {
if (!_searchView) {
_searchView = [[UIView alloc]init];
[self.view addSubview:_searchView];
_searchView.layer.borderColor = [UToColor backGrayColor].CGColor;
_searchView.backgroundColor = [UToColor backWhiteColor];
[_searchView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.mas_equalTo(0);
make.height.mas_equalTo(60);
make.top.mas_equalTo(self.navView.mas_bottom).offset(0);
}];
_searchBar = [[UISearchBar alloc]init];
[_searchView addSubview:_searchBar];
[_searchBar mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(20);
make.centerX.mas_equalTo(_searchView);
make.height.mas_equalTo(40);
make.centerY.mas_equalTo(_searchView);
}];
[_searchBar layoutIfNeeded];
_searchBar.layer.cornerRadius = 20;
_searchBar.layer.masksToBounds = YES;
_searchBar.layer.borderWidth = 0.5;
_searchBar.layer.borderColor = [UToColor separatelineGrayColor].CGColor;
_searchBar.keyboardType = UIKeyboardAppearanceDefault;
_searchBar.placeholder = @"请输入商品名称";
_searchBar.delegate = self;
_searchBar.barTintColor = [UToColor backGrayColor];//底部的颜色
_searchBar.searchBarStyle = UISearchBarStyleDefault;
_searchBar.barStyle = UIBarStyleDefault;
UIView *line = [[UIView alloc]init];
[_searchView addSubview:line];
line.backgroundColor = [UToColor separatelineGrayColor];
[line mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.mas_equalTo(0);
make.height.mas_equalTo(0.7);
make.bottom.mas_equalTo(-1);
}];
}
return _searchView;
}
- 核心代码之搜索代理相关方法
#pragma mark -- UISearchBarDelegate
//在搜索框中修改搜索内容时,自动触发下面的方法
- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar {
return YES;
}
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
NSLog(@"开始输入搜索内容");
searchBar.showsCancelButton = YES;//取消的字体颜色,
[searchBar setShowsCancelButton:YES animated:YES];
//改变取消的文本
for(UIView *view in [[[searchBar subviews] objectAtIndex:0] subviews]) {
if ([view isKindOfClass:[UIButton class]]) {
UIButton *cancel =(UIButton *)view;
[cancel setTitle:@"取消" forState:UIControlStateNormal];
[cancel setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
}
}
}
- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar {
NSLog(@"输入搜索内容完毕");
if (_searchBar.text.length<=0) {
///[self loadData];
NSString *searchStr = _searchBar.text;
NSDictionary *dic = @{@"token":[UToUser sharedUToUser].token,@"operate_type":@(4),@"client_id":_client_id?_client_id:@"",@"searchkey":searchStr,@"page":@(1)};
SXUTONetWorkModel *model = [SXUTONetWorkModel UTONetWorkModelWithUTORequestType:SXUTORequestTypRuKuAllGoods parmeter:dic];
if ([self.netWork request:model userToken:nil Identifier:@"SXUTORequestTypRuKuAllGoods"]) {
self.hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
self.hud.delegate = self;
}
}
}
//搜框中输入关键字的事件响应
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
NSLog(@"输入的关键字是---%@---%lu",searchText,(unsigned long)searchText.length);
//需要事先情况存放搜索结果的数组
[self.resultArray removeAllObjects];
//加个多线程,否则数量量大的时候,有明显的卡顿现象
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
dispatch_async(globalQueue, ^{
if (searchText!=nil && searchText.length>0) {
//遍历需要搜索的所有内容,其中self.dataArray为存放总数据的数组
for (UToStockSaveModel *model in self.dataArray) {///DataModel
NSString *tempStr = model.goods_name;
//----------->把所有的搜索结果转成成拼音
NSString *pinyin = [self transformToPinyin:tempStr];
NSLog(@"pinyin--%@",pinyin);
if ([pinyin rangeOfString:searchText options:NSCaseInsensitiveSearch].length >0 ) {
//把搜索结果存放self.resultArray数组
[self.resultArray addObject:model];
}
}
} else {
self.resultArray = [NSMutableArray arrayWithArray:self.dataArray];
}
//回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
[_tableView reloadData];
});
});
}
// 取消的响应事件
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
NSLog(@"取消搜索");
[searchBar setShowsCancelButton:NO animated:YES];
[searchBar resignFirstResponder];
}
// 键盘上搜索事件的响应
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
NSLog(@"搜索");
[self loadSearchListData];
[searchBar setShowsCancelButton:NO animated:YES];
[searchBar resignFirstResponder];
}
#pragma mark--获取汉字转成拼音字符串 通讯录模糊搜索 支持拼音检索 首字母 全拼 汉字 搜索
- (NSString *)transformToPinyin:(NSString *)aString {
//转成了可变字符串
NSMutableString *str = [NSMutableString stringWithString:aString];
CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformMandarinLatin,NO);
//再转换为不带声调的拼音
CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformStripDiacritics,NO);
NSArray *pinyinArray = [str componentsSeparatedByString:@" "];
NSMutableString *allString = [NSMutableString new];
int count = 0;
for (int i = 0; i < pinyinArray.count; i++) {
for(int i = 0; i < pinyinArray.count;i++) {
if (i == count) {
[allString appendString:@"#"];//区分第几个字母
}
[allString appendFormat:@"%@",pinyinArray[i]];
}
[allString appendString:@","];
count ++;
}
NSMutableString *initialStr = [NSMutableString new];//拼音首字母
for (NSString *s in pinyinArray) {
if (s.length > 0) {
[initialStr appendString: [s substringToIndex:1]];
}
}
[allString appendFormat:@"#%@",initialStr];
[allString appendFormat:@",#%@",aString];
return allString;
}
3.其他效果的搜索框
一般做搜索功能都会与后台约定,后台数据库进行模糊搜索设置。比如有城市选择:成都、成都市双流区。
1.精确搜索:是搜索成都则出现成都、搜索成都市双流区则出现成都市双流区,而搜索成的结果搜不出以上两个词
2.模糊搜索:是搜索成则出现与成有关的所有词,如果后台有设置拼音的,则输入个C就能出现有关C的所有词,如成都、成都市双流区
- 1.简单实时搜索:
Demo链接:https://pan.baidu.com/s/1reFD3pnE1GmWSKx7By0VHg
- 2.点击搜索框导航栏上推效果;有实时搜索和点击搜索两种类型:
Demo链接:https://pan.baidu.com/s/1E6LW0mwarp_FNXXu0-bUSw
- 3.李库管实时搜索:
Demo链接:https://pan.baidu.com/s/1wB_j3QRnpX2QQ40ZL-D1Vw