自定义UISearchController的外观

以前我们在项目中使用搜索框的时候,如果用系统自带的控件则是使用UISearchDisplayController,而自从iOS8之后,系统重新给我们提供了一个搜索控件:UISearchController。在UISearchController中我们无需再自己初始化UISearchBar,只需要提供searchResult展示的视图。然而在开发中,我们往往需要根据项目的风格来改变UISearchBar的外观,通过继承的方式,我们可以完全定制符合项目风格的外观,然而有些情况下我们很难短时间内完成全部的外观定制工作,譬如我们项目用的好几个旧框架,代码中充斥着各种写好的UISearchBar的展示,而改动底层框架并不是一个较好地实践。于是我开始搜索并总结出了几个不通过继承的方式来更改UISearchBar外观的方法。

获取子View

我们在UISearchController或者是UISearchDisplayController中都可以直接获取到UISearchBar的实例,我们可以从这里改变一些UISearchBar的属性来改变外观显示。同时我们也可以直接获取UISearchBar的subViews,UISearchBar的subView是一个UIView的实例,这个UIView包含了所有在UISearchBar上可以展示的子视图,iOS SDK提供的UISearchBar,在iOS7之前是分为UISearchBarBackground、UISearchBarTextField、UIButton这几个类的实例组成,而在iOS7之后,是将UIButton转换为了UINavigationButton的实例。

  • 我们可以通过循环遍历出UISearchBar上所有展示出来的子视图
for(UIView*viewin[[[_searchController.searchBar
 subviews]lastObject]subviews] ) {

if([viewisKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {}

if([viewisKindOfClass:NSClassFromString(@"UISearchBarTextField")]) {}

if([viewisKindOfClass:NSClassFromString(@"UINavigationButton")]) {}

}
  • 通过KVC获取子视图
UIView*backgroundView = [_searchController.searchBar valueForKey:@"_background"];

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

UIButton*cancelButton = [_searchController.searchBar valueForKey:@"_cancelButton"];
  • 当我们获取cancelButton时,一定要确保cancelButton包含在了UISearchBar中,必要时可以提前调用:
[_searchController.searchBar setShowsCancelButton:YES animated:NO];
  • 去掉搜索框背景
for(UIView*viewin[[[_searchController.searchBar subviews]lastObject]subviews] ) {

if([viewisKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {

[view removeFromSuperview];

    }

}
  • 去掉搜索框边框
[_searchController.searchBar setBackgroundImage:[UIImage new]];
  • 改变输入框文本
//提示文本颜色

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

[searchFieldsetTextColor:[UIColorblackColor]];

[searchFieldsetValue:[UIColorgrayColor]forKeyPath:@"_placeholderLabel.textColor"];

[searchFieldsetFont:[UIFontsystemFontOfSize:14]];

[searchFieldsetBackgroundColor:[UIColorwhiteColor]];
  • 改变取消按钮的title
UIButton*cancelButton = [_searchController.searchBar valueForKey:@"_cancelButton"];

[cancelButtonsetTitle:@"Close"forState:UIControlStateNormal];

以上就是基于KVC模式来自定义UISearchBar的外观,至于怎样使用UISearchController来搜索,以及谓词的使用,下一篇文章再更新。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林冠宏的技术文章

android 如何正确使用 泛型 和 多参数 “偷懒”

我要实现这样一个标题栏 ? 共 4 个选项,采用布局是一个 TextView 对应一个小三角 ImageView,各个选项没被点击时,字体颜色是 黑色,小三角不...

2019
来自专栏Rindew的iOS技术分享

使iPhone也可以拥有iPad的pop效果

1904
来自专栏一“技”之长

iOS系统菜单控制器UIMenuController使用简介

   在许多iOS应用中,当用户进行某文字或图片区域的长按操作时,都会弹出一个系统菜单控件,用户可以通过操作菜单控件上的按钮进行数据的复制、剪切、粘贴等操作。系...

1493
来自专栏狂码一生

利用ajaxFileUpload.js实现多文件异步上传功能

  AjaxFileUpload.js是网络开发者写好的插件放出来供大家使用用,原理都是创建隐藏的表单和iframe然后用JS去提交,获得返回值。在这里我将网络...

66713
来自专栏小蠢驴iOS专题

MNKit - 业务开发中简化属性设置的工具类

2338
来自专栏菩提树下的杨过

Flash/Flex学习笔记(17):按键捕获

先来看简单的单个按键捕获: package { import flash.display.Sprite; import fl.controls.Label...

2609
来自专栏上善若水

046android初级篇之android多分辨率兼容

android:anyDensity="true"时,应用程序安装在不同密度的终端上时,程序会分别加载xxhdpi、xhdpi、hdpi、mdpi、ldpi文件...

962
来自专栏落影的专栏

一个多UITableview的左右滑动简单解决方案

前言 本文源自实际开发中的需求,核心的要求有几个: 1、多个UITableview要支持左右滑动; 2、点击Tab也要有UITableview的滑动切换效果...

3576
来自专栏向治洪

React Native 实现基于react-native-tab-navigator库Tab切换封装

react-native-tab-navigator是一款Tab切换的库,细心的读者可能注意到了对于TabNavigator.Item选项卡部分,代码功能上基本...

1.7K6
来自专栏python爬虫日记

wxpython 编程触发菜单或按钮事件

最近逐步熟悉wxpython,编写了几个小小功能的GUI程序,GUI中免不了会有在代码中触发控件事件的业务需求。在其他Gui界面的语言中有postevent、t...

4172

扫码关注云+社区

领取腾讯云代金券