系统的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. java模仿qq好友面板的布局(BoxLayout问题)

    .............. JLabel ll = new JLabel(dlg.getNameText() + ":" + dlg.getIPText(), ii[index] ...

  2. Deep Learning 在中文分词和词性标注任务中的应用

    开源软件包 SENNA 和 word2vec 中都用到了词向量(distributed word representation),当时我就在想,对于我们的中文,是不是也类似地有字向量(distribu ...

  3. Laravel 5 多个视图共享数据的方法

    我们都知道模板一般会用到继承,导航栏就是一个很好的例子,但是导航栏的数据如何共享,比如有个导航的文件叫在view/navigation.blade.php 为了简单一点,文件里只有设置了一个变量 {{ ...

  4. CentOS6.5菜鸟之旅:纯转载Linux目录结构

    来自:http://www.iteye.com/topic/1125162 使用linux也有一年多时间了  最近也是一直在维护网站系统主机  下面是linux目录结构说明 本人使用的是centos系 ...

  5. UIScrollView子控件的布局

    scorllView内部子控件添加约束的注意点: 1.子控件的尺寸不能通过UIScrollView来计算 *比如可以设置固定值 (width==100 height ==100) *比如可以相对于UI ...

  6. C#的回调方法

    C# 里面回调方法一般指某个委托.也可以说是接口. using System; using System.Collections.Generic; using System.Linq; using S ...

  7. 后缀数组---Milk Patterns

    POJ  3261 Description Farmer John has noticed that the quality of milk given by his cows varies from ...

  8. LGLProgressHUD

    不想用第三方的指示器,感觉有点大,自己写了一个简单的活动指示器,目前只有两种效果.效果如图 第一种: 第二种 第二种可以随着提示文字的增多而变长 LGLProgressHUD.h // // LGLP ...

  9. 利用php实现:当获取的网址不是特定网址时候跳转到指定地址

    这个问题是在百度知道看到的问答,我不懂做,特定去百度了下.然后结合别人获取域名和跳转的知识,综合做了这个功能,以下是实现代码: <?php //获取当前的域名: echo "获取到的域 ...

  10. 安装性能测试工具:sysbench和使用apache的ab

    一.软件的用途,它主要包括以下几种方式的测试:1.cpu性能2.磁盘io性能3.调度程序性能4.内存分配及传输速度5.POSIX线程性能6.数据库性能(OLTP基准测试) 这个软件为什么找不到官网呢? ...