当前位置: 移动技术网 > IT编程>移动开发>IOS > IOS改变UISearchBar中搜索框的高度

IOS改变UISearchBar中搜索框的高度

2019年07月24日  | 移动技术网IT编程  | 我要评论

优寡心,港视,长女的美丽人生印度

一、系统的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 uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网