自定义搜索框样式,如何手动实现一个

2019-09-11 16:07栏目:专项工作
TAG:

先看效果图:

UIKit 坐标系每一个 View 都定义了他自己的坐标系,如下图所示,x 轴指向右方,y 轴指向下方:

很多APP都会涉及到搜索框,苹果也为我们提供了默认的搜索框UISearchBar。但实际项目中我们通常需要更改系统默认搜索框的样式。为了实现这一目标,我们需要先搞懂 UISearchBar 的属性及方法。在系统的掌握了这些基础的前提下才能更好的去应用它,包括修改样式、或者是模仿系统搜索框的样式自定义一个自己的搜索框等。

图片 1ScreenCaptureProject3.gif图片 2demo.gif

图片 3image.png

本文主要介绍内容分为以下三个部分:

分页控制器分两部分,一是分页控制器,标题联动,分为内容页和导航标题视图,通过点击和滚动来同步状态。

注意:这个逻辑坐标系并不关注包含在其中 View 的宽度和高度,整个坐标系没有边界向四周无限延伸。我们在坐标系中放置四个子 View,每一次色块代表一个 View

1. UISearchBar 的属性
#pragma mark - delegate#pragma mark - 导航分类选择代理 点击标题滚动到相应的界面- XSNavChooseView:(XSNavCouseChoseView *)chooseView clickItem:itemModel withIndex:(NSInteger)index { CGFloat offsetX = index *self.view.frame.size.width; [_backScrollView setContentOffset:CGPointMake(offsetX,0)animated:NO]; [self addChildVCWithIndex: index];}#pragma mark - ScroollView Delegate 拖动结束同步标题状态- scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ if (![scrollView isKindOfClass:[UITableView class] ]) { CGPoint offset = scrollView.contentOffset; _navCoureCategoryView.currentBtnIndex = offset.x/self.view.frame.size.width; NSInteger index = offset.x/self.view.frame.size.width; [self addChildVCWithIndex: index]; }}

图片 4image.png

2. UISearchBar 的方法

所有的子控制器都是作为首页的自控制器,并在界面显示时候加载出来,支持标题的增减,不过至少保留一个首页

UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 100, 100)];redView.backgroundColor = [UIColor colorWithRed:0.815 green:0.007blue:0.105 alpha:1];UIView *greenView = [[UIView alloc] initWithFrame:CGRectMake(150, 160, 150, 200)];greenView.backgroundColor = [UIColor colorWithRed:0.494 green:0.827blue:0.129 alpha:1];UIView *blueView = [[UIView alloc] initWithFrame:CGRectMake(40, 400, 200, 150)];blueView.backgroundColor = [UIColor colorWithRed:0.29 green:0.564blue:0.886 alpha:1];UIView *yellowView = [[UIView alloc] initWithFrame:CGRectMake(100, 600, 180, 150)];yellowView.backgroundColor = [UIColor colorWithRed:0.972 green:0.905blue:0.109 alpha:1];[mainView addSubview:redView];[mainView addSubview:greenView];[mainView addSubview:blueView];[mainView addSubview:yellowView];
3. 自定义 UISearchBar 的样式

介绍之前先说一下 UISearchBar 的初始化方法:UISearchBar 是 UIView 的子类,它的初始化方法有三种:

- (instancetype)init - (instancetype)initWithFrame:frame - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder 

这三个初始化方法是我们常见的初始化 UIView 以及它的子类的方法,比较常见,而且也不是介绍重点,所以这里不展开说明。

标题改变时候只改变导航标题- setNavTitleAry:(NSMutableArray *)navTitleAry { _navTitleAry = navTitleAry; self.navCoureCategoryView.modelAry = navTitleAry; self.backScrollView.contentSize = CGSizeMake(self.view.frame.size.width * _navTitleAry.count, _backScrollView.frame.size.height); [_backScrollView setContentOffset:CGPointMakeanimated:NO]; // 导航栏数据变化移除子控制器 [self.childViewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if (![obj isKindOfClass:[XSRecommendVC class]]) { //[self removeChild:obj]; [obj removeFromParentViewController]; } }];}只有视图显示,滚动或者点击标题才添加到首页- addChildVCWithIndex:(NSInteger )index { __block BOOL ishasVC = NO; [self.childViewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if ([obj.title isEqualToString:_navTitleAry[index]]) { ishasVC = YES; } }]; // 判断是否存在自控制器, 没有添加 if (ishasVC == YES) { return; } NSString *titleName = _navTitleAry[index]; XSCourseCategoryVC *courseVC = [[XSCourseCategoryVC alloc] init]; courseVC.view.frame = CGRectMake(self.view.frame.size.width * index, 0, self.view.frame.size.width, _backScrollView.frame.size.height); [_backScrollView addSubview:courseVC.view]; courseVC.title = titleName; [self addChildViewController:courseVC];}

Apple 关于 UIView 的文档中是这样描述 bounds 属性的:

1.1 搜索框风格
  • 属性
// 搜索框风格@property(nonatomic) UIBarStyle barStyle;

UIBarStyle 有四种枚举值,但后两种已经禁用。

typedef NS_ENUM(NSInteger, UIBarStyle) { UIBarStyleDefault //白色搜索框,灰色背景 UIBarStyleBlack //黑色搜索框, UIBarStyleBlackOpaque = 1, // 禁用. Use UIBarStyleBlack UIBarStyleBlackTranslucent = 2, // 禁用. Use UIBarStyleBlack and set the translucent property to YES}
  • 效果图:

图片 5UIBarStyleDefault 样式 图片 6UIBarStyleBlack样式

二是分类选择器,支持collectionView的增删,拖动排序,原样是一个仿腾讯新闻的频道选择器,我在原来的基础上满足需求做了修改,原作者做了详细的说明,具体的请链接到:

bounds矩形…描述了该视图在其自身坐标系中的位置和大小。

1.2 搜索的文本、搜索框顶部的提示信息、占位符
  • 属性
 // 搜索的文本@property(nullable,nonatomic,copy) NSString *text; // 搜索框顶部的提示信息 @property(nullable,nonatomic,copy) NSString *prompt; // 占位符,默认nil, 若有值则在输入文本后消失@property(nullable,nonatomic,copy) NSString *placeholder; 
  • 效果图:

图片 7prompt 和 placeholder 图片 8输入文本为 text 后 placeholder 消失

// 科目选择器- pushToChooseCourseCategoryVC { typeof weakSelf = self; [[XLChannelControl shareControl] showChannelViewWithInUseTitles:_navTitleAry unUseTitles:_unUserTitleAry finish:^(NSArray *inUseTitles, NSArray *unUseTitles, NSString *title, BOOL isChange) { if  { weakSelf.navTitleAry = inUseTitles.mutableCopy; weakSelf.unUserTitleAry = unUseTitles.mutableCopy; } if  { // 点击 相应标题跳转到指定界面 [weakSelf.navTitleAry enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if ([title isEqualToString:obj]) { [self addChildVCWithIndex:idx]; weakSelf.navCoureCategoryView.currentBtnIndex = idx; CGFloat offsetX = idx *weakSelf.view.frame.size.width; [weakSelf.backScrollView setContentOffset:CGPointMake(offsetX,0)animated:NO]; } }]; } }];}

一个 View 可以被看作是定义在其所在坐标系平面上的一个矩形的可视区域,View 的边界表明了这个矩形可视区域的位置和大小。

1.3 搜索框右侧的按钮
  • 属性
// 搜索框右侧是否显示图书按钮 @property(nonatomic) BOOL showsBookmarkButton; //搜索框右侧是否显示取消按钮 @property(nonatomic) BOOL showsCancelButton; //搜索框右侧是否显示搜索结果按钮 @property(nonatomic) BOOL showsSearchResultsButton; // 搜索结果按钮为选中状态@property(nonatomic, getter=isSearchResultsButtonSelected) BOOL searchResultsButtonSelected;

以上四个属性的默认值都是 NO

  • 效果图:

图片 9showsBookmarkButton = YES 效果图片 10showsCancelButton = YES 效果图片 11showsSearchResultsButton = YES 效果图片 12searchResultsButtonSelected = YES 效果,要结合showsSearchResultsButton = YES使用

图片 13Jietu20171018-232022@2x.jpg图片 14Jietu20171018-232056@2x.jpg

假设我们的 View 宽320像素,高480像素,原点在。那么这个 View 就变成了整个坐标系平面的观察口,它展示的只是整个平面的一小部分。位于该 View 边界外的区域依然存在,只是被隐藏起来了。

1.4 风格颜色、背景颜色
  • 属性
// 风格颜色,可用于修改输入框的光标颜色,取消按钮和选择栏被选中时候都会变成设置的颜色@property(null_resettable, nonatomic,strong) UIColor *tintColor;// 搜索框背景颜色@property(nullable, nonatomic,strong) UIColor *barTintColor;
  • 测试代码
 self.tintColor = [UIColor orangeColor]; //设置光标颜色为橘色 self.barTintColor = [UIColor grayColor]; //设置搜索框背景颜色为灰色
  • 效果图:

图片 15tintColor 和 barTintColor

版权声明:本文由ag真人发布于专项工作,转载请注明出处:自定义搜索框样式,如何手动实现一个