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的内边距

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

(0)

相关推荐

  • iOS 设置UILabel的行间距并自适应高度的方法

    实例如下: NSString *contentStr = @"总以为,在最初的地方,有一个最原来的我,就也会有一个最原来的你"; UILabel *tempLabel = [[UILabel alloc] init]; //设置背景颜色 tempLabel.backgroundColor = [UIColor redColor]; //设置内容 tempLabel.text = contentStr; //设置字体颜色 tempLabel.textColor = [UIColor wh

  • iOS获取Label高度的几种方法与对比

    介绍 在设置 UILabel 的 Frame 高度时,不能简单的设置为字体的 font size.否则会将字体的一部分裁剪掉.因为 UILabel 在不同的字体设置下,对 Frame 的高度要求也不一样,大多数情况下都比Font的高度设置要高一些. 一.sizeThatFits 使用 view 的 sizeThatFits 方法. // return 'best' size to fit given size. does not actually resize view. Default is

  • iOS App开发中使cell高度自适应的黑魔法详解

    在使用 table view 的时侯经常会遇到这样的需求:table view 的 cell 中的内容是动态的,导致在开发的时候不知道一个 cell 的高度具体是多少,所以需要提供一个计算 cell 高度的算法,在每次加载到这个 cell 的时候计算出 cell 真正的高度. 在 iOS 8 之前 没有使用 Autolayout 的情况下,需要实现 table view delegate 的 tableView(tableView: UITableView, heightForRowAtInde

  • iOS Webview自适应实际内容高度的4种方法详解

    //第一种方法 - (void)webViewDidFinishLoad:(UIWebView *)webView { CGFloat webViewHeight=[webView.scrollView contentSize].height; CGRect newFrame = webView.frame; newFrame.size.height = webViewHeight; webView.frame = newFrame; _webTablewView.contentSize = C

  • IOS 中UITextField,UITextView,UILabel 根据内容来计算高度

    IOS 中UITextField,UITextView,UILabel 根据内容来计算高度 在开发的过程中,常常遇到根据内容来决定控件的高度的情况,常见的就是UITextField,UITextView,UILabel这三个控件,下面一UITextView 为例来说明一下: 首先新新建一个textView. 设施text,font UITextView *textView = [[UITextView alloc] init]; textView.text = @"2015-01-19 14:0

  • iOS UILabel根据内容自动调整高度

    一.效果图 二.代码 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. //根据内容自动调整高度 NSString *str = @"公元前3000年,印度河流域的居民的数字使用就已经比较普遍,居民们采用了十进位制的计算法."; UIFont *font = [UIFont systemFontOfSize:13]; CGSize size = CG

  • ios动态设置lbl文字标签的高度

    复制代码 代码如下: txtlbl.font = [UIFont boldSystemFontOfSize:14.0f];     txtlbl.numberOfLines = 0;  NSString *str = @"        阿方决定设立科技特网络离开电视剧分w额两个大陆高科技了了不见了日i倒计时离开我说老师肯德基弗兰克萨江东父老将费德勒说阿方决定设立科技特网络离开电视剧分w额两个大陆高科技了了不见了日i倒计时离开我立科说老师肯德基弗兰克萨江东父老将费德勒说";    CG

  • 详解iOS tableViewCell自适应高度 第三发类库

    在github中有许多大牛封装好的第三发类库,其中有个自适应cell高度的类库 下载地址:https://github.com/gsdios/SDAutoLayout model类 commentsModel #import "JSONModel.h" #import "getCommentData.h" @interface commentsModel : JSONModel @property(nonatomic,copy)NSArray<getComme

  • 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只会影响其中搜索框的宽度

  • iOS 使用UITextField自定义搜索框 实现用户输入完之后“实时搜索”功能

    注:CSDN的代码块有点捞,如果浏览器窗口较窄,一行代码占了两行的位置,后面的代码就看不到了,大家可以把浏览器窗口拉大一点 UI小姐姐设计的搜索框经常是五花八门,系统的搜索框经常不能满足我们的需求,需要我们特别定制一个.但是UITextField的诸多回调里面,没有一个是适合触发搜索时间的. UITextFieldTextDidChangeNotification调用过于频繁,每输入一个字符就调一次接口怕是不太合适. UITextFieldTextDidEndEditingNotificatio

  • iOS之单独使用UISearchBar创建搜索框的示例

    这里实现的是进入页面后直接在导航栏上显示搜索框(包含右侧取消按钮),并弹出键盘且搜索框为直接可输入状态(第一响应者),点击右侧取消按钮后收起键盘并返回上一页. 搜索页面 1.实现代理UISearchBarDelegate @interface SearchViewController ()<UISearchBarDelegate> 2.创建一个UISearchBar为属性 @property (nonatomic, strong) UISearchBar *searchBar; 3.进入页面后

  • Angularjs material 实现搜索框功能

    angular-material 是 AngularJS 的一个子项目,用来提供实现了 Material Design 风格的组件. Material 提供了大量的android 风格的UI组件,使用 angularjs + Material 可以很容易开发出风格接近原生 Android 5.x 的web界面.但在实际使用的过程中并不总是能满足我们的需求.开发一个组件就成了我们必须学习的内容. 下面是一个组件的实现: //前面省略若干代码 directive('mdSearchInput',[f

  • 小程序实现搜索框

    小程序中搜索框的简单实现,供大家参考,具体内容如下 搜索框 搜索框无论是在电商网站还是小程序中是很常见的,那么在小程序中是如何实现的呢,我们一起来看看吧(过程遇到很多问题). 思路 在搜索框中输入关键词时,应该会向服务器发送请求,因为没有相关接口,所以我就模拟数据啦,用文档中API中的setStorage和getStorage在本地存储数据和读取数据,在搜索框中输入时若能匹配到则显示,若匹配不到,则显示"没有数据". 模糊搜索 search.wxml <!--pages/sear

  • iOS中Swift UISearchController仿微信搜索框

    创建一个UISearchController 如果传入的searchResultsController为nil,则表示搜索的结果在当前控制器中显示,现在我让它在searchResultVC中显示 // 创建searchResultVC let searchResultVC = UIViewController() // 设置背景颜色为红色 searchResultVC.view.backgroundColor = UIColor.red let searchController = UISear

  • iOS中searchBar(搜索框)光标初始位置后移

    废话不多说了,直接给大家贴关键代码了,具体代码如下所示: #import <UIKit/UIKit.h> @interface SearchBar : UITextField @property (nonatomic,strong) UIButton *button; + (instancetype)searchBar; @end #import "SearchBar.h" @implementation SearchBar - (id)initWithFrame:(CGR

  • iOS开发实现搜索框(UISearchController)

    最近自己在写一个APP,其中需要实现搜索框搜索功能,于是乎就想写篇博客介绍下UISearchController和搜索框的实现. 我写的是一个天气预报APP,直接以我APP中的源代码来详细介绍下搜索框的实现. 注:在iOS 8.0以上版本中, 我们可以使用UISearchController来非常方便地在UITableView中添加搜索框. 而在之前版本中, 我们还是必须使用UISearchBar + UISearchDisplayController的组合方式. 初始化UISearchCont

  • jQuery动态改变多行文本框高度的方法

    本文实例讲述了jQuery动态改变多行文本框高度的方法.分享给大家供大家参考,具体如下: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>文本框高度变化</title> <style type="text/css"> * { margin: 0

随机推荐

其他