UITextFiled 内容偏移问题探究

作者: 等开会 | 来源:发表于2016-11-25 15:08 被阅读1018次

最近使用 UITextField 的时候发现一个奇怪的问题,在一个普通的带有有导航栏的ViewController中,用普通的方式添加了一个普通的 UITextField,如图1(为了使问题更明显,所以把高度设成了300),输入文字之后,点按home键将程序切换到后台,然后再点击icon唤起程序时,textField中的内容会向下偏移一段距离,如图2。

图1.png 图2.png

黑人问号???

谷歌一下,我似乎发现了问题的原因:

原来,在iOS7后,苹果为 UIViewController 新添加了一个属性,而且其默认值为YES,

@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets NS_AVAILABLE_IOS(7_0); // Defaults to YES

这个属性的作用是,指定控制器是否应该自动调整其子视图中 ScrollView 的 ContentInset,从而使其内容能够完整展示,不被status bar, search bar, navigation bar, toolbar 或者 tab bar遮盖。

最典型的例子就是iOS7后 UITableView 的 frame.origin.y 通常都是从0开始的,而当我们push到一个 tableViewController 时,其内容却不是从0开始,而是从64(导航栏+状态栏)开始的,就是这个属性起的作用,它会自动给tableView增加一个64的Top ContentInset(前提是当前页面有导航栏),这样得到的结果就是,tableView 是从界面顶部开始的,而其内容却是从导航栏下面开始的。

这个属性在一个界面有2个以上 tableView 的时候也会用上,与此属性类似的还有 edgesForExtendedLayout 和 extendedLayoutIncludesOpaqueBars ,具体的不同可以看苹果官方文档或者 戳这里

然后,我设置当前VC的 automaticallyAdjustsScrollViewInsets = NO 之后,问题解决了。

但是,身为一个有梦想的程序员,我们不能止步于此。

这个属性是针对 UIScrollView 和它的子类的,但是 UITextFiled 可不是继承自 UIScrollView 啊 ?

于是,我推测应该是 UITextField 里面有一个子view是 UIScrollView 的子类,所以会受到 automaticallyAdjustsScrollViewInsets 属性的影响。

通过Xcode自带的 Debug View Hierarchy 工具查看内容偏移后的textFiled,如图3,发现 UITextFiled 有一个叫 UIFieldEditor 的子视图,它有一个 contentView,而它的bounds偏移了64,这不就是传说中的 UIScrollView 的子类嘛!

图3.png

由于这个类是苹果的私有类,所以我们不能直接进入它的头文件查看,但是通过查阅资料发现,这个UIFieldEditor确实是UIScrollView的子类,如图4。

图4.png

真相大白: )


另外,经同事提醒,只有在UITextField处于编辑状态时这个问题才会出现,用 Debug View Hierarchy 工具查看,发现UITextField在编辑状态时子视图是UIFieldEditor(UIScrollView的子类),而在非编辑状态时子视图是UITextFiledLabel(UILabel的子类), 斯国一 ~

相关文章

  • UITextFiled 内容偏移问题探究

    最近使用 UITextField 的时候发现一个奇怪的问题,在一个普通的带有有导航栏的ViewController...

  • 整理项目中遇到的小技巧

    1、在UITextField中输入内容时,内容向下偏移 解决:UITextFiled在非编辑状态只有一个子类UIT...

  • 输入框字符限制

    UITextFiled限制 直接使用MaxLength(UITextFiled分类)即可。 问题是不支持unico...

  • iOS 改版之前问题记录

    改版之前问题记录 1:修改房间标题,使用UITextFiled, 不管内容有没有变化,都进行http 请求??? ...

  • UITextfiled的问题

    1、格式化输入框(如电话号码,身份证等)删除的问题 UITextFiled自己处理了选择范围和移动光标相关的问题,...

  • 模拟UITextFiled删除键

    UITextFiled *textFiled = [[UITextFiled alloc] init]; [tex...

  • 教育随笔陈剑锋

    议问题探究化 问题探究化,就是注意在课堂教学过程中,将教材里的文字内容、图片资料等...

  • 内容的偏移设置

    为了美观,如果一个图片或者文字要向左或者向右偏移一些,那么马上想到它属于哪个控件的内容,直接调用该控件的conte...

  • 关于ios的继承

    重写UitextFiled(利用draw,将UitextFiled风格变成一条线) 继承UIscrollerVie...

  • 006--iOS底层 - 类的结构(属性、成员变量、方法的探索)

    引言 上一篇讲到了内存偏移的知识和操作,接下来内存偏移将在本文用到具体的示例。我们对对象的探究已经了解了对象的底层...

网友评论

  • caa5bb2b47bc:我删除textfield的顶部和底部布局就好了(我的textfield的父视图是一个view)
  • 超_iOS:这个子类在编辑时应该会再最上方,会覆盖tf上边的button,你试过么
    等开会:你说的button是那个清除button么, Debug View Hierarchy 中能看到没有覆盖呀

本文标题:UITextFiled 内容偏移问题探究

本文链接:https://www.haomeiwen.com/subject/ruzipttx.html