IOS改变UISearchBar中搜索框的高度

这篇文章主要介绍了IOS改变UISearchBar中搜索框的高度的相关资料,需要的朋友可以参考下

一、系统的searchBar
1、UISearchBar的中子控件及其布局
UIView(直接子控件) frame 等于 searchBar的bounds,view的子控件及其布局

  • UISearchBarBackground(间接子控件) frame 等于searchBar的bounds
  • UISearchBarTextField(间接子控件) frame.origin等于(8.0, 6.0),即不等于searchBar的bounds

2、改变searchBar的frame只会影响其中搜索框的宽度,不会影响其高度,原因如下:

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

二、改变UISearchBar的高度
1、方案
重写UISearchBar的子类(IDSearchBar),重新布局UISearchBar子控件的布局
增加成员属性contentInset,控制UISearchBarTextField距离父控件的边距

  • 若用户没有设置contentInset,则计算出默认的contentInset
  • 若用户设置了contentInset,则根据最新的contentInset布局UISearchBarTextField

2、具体实现
重写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使用示例
1、未设置contentInset
设置searchBar的frame


searchBar.frame = CGRect(x: 80, y: 100, width: 200, height: 40)

效果如图


2、设置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的设计原则
1、注意

  • UISearchBar默认是有自己默认的布局方式的
  • 设计IDSearchBar旨在改变searBar中搜索框的高度,但是可能会有改变宽的的需求

2、设计原则

  • 在没有改变searchBar中搜索框的高度的需求时,需要使用UISearchBar的默认布局
  • 若需要改变searchBar中搜索框的高度的需求时,需要按照需求来改变UISearchBar的布局
  • 为了增加可控性,在IDSearchBar中增加成员属性contentInset来控制IDSearchBar的内边距

以上就是本文的全部内容,希望对大家的学习有所帮助。

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

这篇文章主要介绍了iOS开发中使用storyboard创建导航控制器的方法,包括对控制器声明周期的控制介绍,代码基于传统的Objective-C,需要的朋友可以参考下
这篇文章主要介绍了讲解iOS开发中UITableView列表设计的基本要点,其中对列表行操作的常用操作举例是iOS开发中经常用到的基础,需要的朋友可以参考下
这篇文章主要介绍了Objective-C处理空字符串和页面传值及自定义拷贝的相关方法,在iOS应用项目开发中经常会用到,需要的朋友可以参考下
如果说自动布局解救了多屏幕适配,那众多三方库的出现就解救了系统自动布局的写法。Masonry就是其中一个。用法上也比较简单灵活,很大程度上替代了传统的NSLayoutConstraint布局方式。下面我们就来具体探讨下吧
这篇文章主要介绍了百度云推送图文教程IOS 的相关资料,需要的朋友可以参考下
这篇文章主要介绍了iOS开发中使app获取本机通讯录的实现代码实例,主要用到了AddressBook.framework和AddressBookUI.framework,代码基于传统的Objective-C,需要的朋友可以参考下