美文网首页M_iOSiOSer杂谈
使用KVC自定义UISearchBar外观

使用KVC自定义UISearchBar外观

作者: SeraZheng | 来源:发表于2015-12-23 15:31 被阅读2429次

    前言

    在iOS8中,Apple在UIKit框架中给我们提供了UISearchController来代替之前的UISearchDisplayController,在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的实例。

    1.我们可以通过循环遍历出UISearchBar上所有展示出来的子视图

    for(UIView*viewin[[[_searchController.searchBar subviews]lastObject]subviews] ) {

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

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

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

    }

    2.通过KVC获取子视图

    UIView*backgroundView = [_searchController.searchBar valueForKey:@"_background"];

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

    UIButton*cancelButton = [_searchController.searchBar valueForKey:@"_cancelButton"];

    3.当我们获取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];

    原文链接:郑少博的技术博客--自定义UISearchBar外观

    相关文章

      网友评论

      • ed3f0e081820:你好,请问如何使放大镜图片和place holder文字默认居左? 谢谢。
      • OnlyLoveYu:textfield 占位符左对齐怎么设置 找了好久 求指教
      • 小阳哥_:怎么更改取消按钮的字体颜色呢
        SeraZheng: @Marshall_TOYO 修改字体之前,先设置cancelButton为显示状态,通过UISearchBar的API,之后再改字体
        小阳哥_:确实能获取到cancelButton 但是就是改不来字体颜色啊 怎么改都是蓝色 如果能改 希望写个demo 发一下 谢谢了 752860629@qq.com
        SeraZheng:@Marshall_TOYO 通过KVC获取到UISearchBar的子view cancelButton,然后修改title的颜色
      • 屈涯:以前写没有写出来
      • 华南犀牛:😂😂插图会更有趣哟!!!不然看客都不懂你的最终效果如何?是不是他们需要的
        SeraZheng: @HansRove 非常感谢你的建议,在以后的文章中会记住这一点

      本文标题:使用KVC自定义UISearchBar外观

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