系统的searchBar


  • UISearchBar的中子控件及其布局

    • UIView(直接子控件) frame 等于 searchBar的bounds,view的子控件及其布局

      • UISearchBarBackground(间接子控件) frame 等于searchBar的bounds
      • UISearchBarTextField(间接子控件) frame.origin等于(8.0, 6.0),即不等于searchBar的bounds
  • 改变searchBar的frame只会影响其中搜索框的宽度,不会影响其高度,原因如下:

    • 系统searchBar中的UISearchBarTextField的高度默认固定为28
    • 左右边距固定为8,上下边距是父控件view的高度减去28除以2

改变UISearchBar的高度


  • 方案

    • 重写UISearchBar的子类(IDSearchBar),重新布局UISearchBar子控件的布局
    • 增加成员属性contentInset,控制UISearchBarTextField距离父控件的边距
      • 若用户没有设置contentInset,则计算出默认的contentInset
      • 若用户设置了contentInset,则根据最新的contentInset布局UISearchBarTextField
  • 具体实现

    • 重写UISearchBar的子类

      class IDSearchBar: UISearchBar {
      
      }
    • 增加成员属性contentInset(可选类型),控制UISearchBarTextField距离父控件的边距,监听其值的改变,重新布局searchBar子控件的布局

      var contentInset: UIEdgeInsets? {
      didSet {
      self.layoutSubviews()
      }
      }
    • 重写layoutSubviews()布局searchBar的子控件

      override func layoutSubviews() {
      super.layoutSubviews() // view是searchBar中的唯一的直接子控件
      for view in self.subviews {
      // UISearchBarBackground与UISearchBarTextField是searchBar的简介子控件
      for subview in view.subviews { // 找到UISearchBarTextField
      if subview.isKindOfClass(UITextField.classForCoder()) { if let textFieldContentInset = contentInset { // 若contentInset被赋值
      // 根据contentInset改变UISearchBarTextField的布局
      subview.frame = CGRect(x: textFieldContentInset.left, y: textFieldContentInset.top, width: self.bounds.width - textFieldContentInset.left - textFieldContentInset.right, height: self.bounds.height - textFieldContentInset.top - textFieldContentInset.bottom)
      } else { // 若contentSet未被赋值
      // 设置UISearchBar中UISearchBarTextField的默认边距
      let top: CGFloat = (self.bounds.height - 28.0) / 2.0
      let bottom: CGFloat = top
      let left: CGFloat = 8.0
      let right: CGFloat = left
      contentInset = UIEdgeInsets(top: top, left: left, bottom: bottom, right: right)
      }
      }
      }
      }
      }

IDSearchBar使用示例


  • 未设置contentInset

    • 设置searchBar的frame

      searchBar.frame = CGRect(x: 80, y: 100, width: 200, height: 40)
    • 效果如图

  • 设置contentInset

    • 设置searchBar的frame

      searchBar.frame = CGRect(x: 80, y: 100, width: 200, height: 40)
    • 设置searchBar的contentInset

      // 设置contentInset
      searchBar.contentInset = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 8)
    • 效果如图

IDSearchBar的设计原则


  • 注意

    • UISearchBar默认是有自己默认的布局方式的
    • 设计IDSearchBar旨在改变searBar中搜索框的高度,但是可能会有改变宽的的需求
  • 设计原则
    • 在没有改变searchBar中搜索框的高度的需求时,需要使用UISearchBar的默认布局
    • 若需要改变searchBar中搜索框的高度的需求时,需要按照需求来改变UISearchBar的布局
    • 为了增加可控性,在IDSearchBar中增加成员属性contentInset来控制IDSearchBar的内边距

UISearchBar改变搜索框的高度的更多相关文章

  1. iOS开发UI篇 -- UISearchBar 属性、方法详解及应用(自定义搜索框样式)

    很多APP都会涉及到搜索框,苹果也为我们提供了默认的搜索框UISearchBar.但实际项目中我们通常需要更改系统默认搜索框的样式.为了实现这一目标,我们需要先搞懂 UISearchBar 的属性及方 ...

  2. ios UISearchBar搜索框的基本使用

    摘要: 小巧简洁的原生搜索框,漂亮而易用,如果我们的应用没有特殊需求,都可以使用它. iOS中UISearchBar(搜索框)使用总结 初始化:UISearchBar继承于UIView,我们可以像创建 ...

  3. iOS之搜索框UISearchController的使用(iOS8.0以后替代UISearchBar+display)

    在iOS 8.0以上版本中, 我们可以使用UISearchController来非常方便地在UITableView中添加搜索框. 而在之前版本中, 我们还是必须使用UISearchBar + UISe ...

  4. iOS --- 搜索框UISearchController的使用(iOS8.0以后替代UISearchBar+display)

    在iOS 8.0以上版本中, 我们可以使用UISearchController来非常方便地在UITableView中添加搜索框. 而在之前版本中, 我们还是必须使用UISearchBar + UISe ...

  5. 快捷搜索框(UISearchBar)简单实现 swift

    1.在故事板里面拖入一个搜索栏和一个的tableView.2.创建的ViewController,实现代理:UISearchBarDelegate,UITableViewDataSource,的UIT ...

  6. iOS学习之NSPredictae及搜索框的实现

    NSPredicate Predicate 即谓词逻辑, Cocoa框架中的NSPredicate用于查询,作用是从数据堆中根据条件进行筛选.计算谓词之后返回的结果永远为BOOL类型的值,当程序使用谓 ...

  7. iOS搜索框

    在iOS8以前搜索框是作为一个控件添加到TableViewController中, 有系统自带的搜索变量self.searchDisplayController 遵守一个搜索显示的协议<UISe ...

  8. iOS 搜索框控件 最简单的dome

    刚学习搜索框控件,写了个最简单的dome #import <UIKit/UIKit.h> .h @interface ViewController : UIViewController&l ...

  9. EasyUI基础searchbox&amp;progressbar(搜索框,进度条)

    easyui学习的基本组成部分(八个部分)硕果仅存searchbox和pargressbar.tooltip该,有一点兴奋.本文将偏向searchbox和pargressbar做一个探讨.鉴于双方的内 ...

随机推荐

  1. WCF学习之二

    今天在照着网上教程做练习的时候,用IE浏览器运行的时候遇到了一些问题 “找不到类型“WCFService.Service1”,它在 ServiceHost 指令中提供为 Service 特性值,或在配 ...

  2. redis实现有序的消息队列

    redis是什么东西就不多说了,网上文章一搜一大堆. 首先来说一下我要实现的功能: 类似一个消息中转站吧,如果有人要发送消息,先将消息发到我这里来,然后我这边进行转发,为的就是有一个统一的管理和修改时 ...

  3. UML系列05之 基本流程图

    概要 软件的基本流程图是我们在学习编程时的必修课,它很简单,却很实用.需要说明的是,UML并不包括软件的基本流程图,但是为了方便我自己查阅,所以将基本软件流程图归纳到UML系列当中.读者切不要认为基本 ...

  4. MPU9250调试

    MPU9250 芯片概述 MPU9250芯片是一个9轴姿态传感芯片,其中包含了3轴加速度传感器.3轴角速度传感器以及三轴磁力计. 其本质上是MPU6050芯片+AK8963. 可以获取传感芯片的加速度 ...

  5. TFS(Team Foundation Server)敏捷使用教程(四):工作项跟踪(1)

    工作项跟踪(1) 可跟踪性是软件过程的重要能力,TFS主要是以工作项来实现过程的可跟踪性.曾有人问:"你们实际项目里的工作项是怎么样的?能不能让我们看看?"我也一直很好奇别的公司T ...

  6. springMVC基础

    controllers包写控制器: @Controller @RequestMapping(value="/utils") public class UploadControlle ...

  7. .NET 笔试题--自已作答

    以下题目,我已全部作答,答案仅供参考!水平和理解有限,可能有误,欢迎指正,谢谢! 1. 填空: (1)面向对象的语言具有__继承______性._____多态____性.____封装____性. (2 ...

  8. WatiN框架学习

    WatiN 是一个源于 Watir的工具,开源且用于web测试自动化的类库.Web Application Testing in .NET. WatiN 通过与浏览器的交互来实现自动化,使用起来具有轻 ...

  9. jquery.ajax 跨域请求webapi,设置headers

    解决跨域调用服务并设置headers 主要的解决方法需要通过服务器端设置响应头.正确响应options请求,正确设置 JavaScript端需要设置的headers信息 方能实现. 1.第一步 服务端 ...

  10. 解决jQuery插件冲突

    项目框架的JS库集成了jQuery,Layout页面(模板页面,类似ASP.NET的母版页)中引用了这些JS,后来使用图表插件(图表插件是基于jQuery的)的时候,项目框架中的JS和图表插件有冲突, ...