美文网首页iOS开发大神总结UIKit
iOS UITextView 的坑:启动时文字位置不从顶部开始

iOS UITextView 的坑:启动时文字位置不从顶部开始

作者: 戴仓薯 | 来源:发表于2017-02-07 12:29 被阅读1025次

    问题描述

    今天有个同学发了一个很简单的 demo。里面只有一个 viewController,里面只有一个用 autoLayout 约束、充满屏幕的 UITextView,UITextView 里面充满了大段文字(大概是 UITextView 高度的三倍)。xib 的预览尺寸选的是 View as: iPhone 7,然后运行在 iPhone 5s 或 SE 的模拟器上,发现 UITextView 自动滚动到了中间位置,而不像正常一样是从顶部开始的。

    问题原因

    经过反复尝试,发现出现问题的必要条件如下:

    1. 用 autoLayout 约束,或用 autoResizing 并配置为缩放。
    2. 在实际运行时,UITextView 的尺寸相比在 xib 里是缩小,而不是放大。

    看起来像是 autoLayout 带来的一个系统 bug。

    解决方法

    正常的解决方法:

    1. 此处放弃使用 autoLayout 或 autoResizing 的缩放;
    2. 用代码手动调整一下 contentOffset,比如在 viewDidLayoutSubviews 里:
    - (void)viewDidLayoutSubviews {
        [self.textView setContentOffset:CGPointZero animated:NO];
    }
    

    hacky 的解决方法:
    在 xib 里把 UITextView 的尺寸手动拉小,不去管黄色的 warning;或者 View as 选最小的一个屏幕尺寸。这样在运行时,UITextView 只会放大,不会缩小,问题也就消失了。不过,不能防止日后同事或者自己忘记了这一点,不小心改了回来,问题还会出现。

    所以,我们还是尽量选择正常的解决方法吧~

    相关文章

      网友评论

      • wwwbbat:我觉得是 automaticallyAdjustsScrollViewInsets 在作怪。 UITextView继承至UIScrollView。当UIScrollView是 UIViewController的view的第一个子view时,会自动调整UIScrollView的contentInset。 所以有这几个方法可以解决:1:automaticallyAdjustsScrollViewInsets 设置为NO。2:手动加一个空白的view作为第一个子view。3:UITextView的顶部约束不要约束在 layoutGuide上,而是约束在view上。4:修改 edgesForExtendedLayout的top值。
        龙伟17:波哥哥 我顶你
        戴仓薯:关于这篇文章的问题,我第一反应就是尝试了 automaticallyAdjustsScrollViewInsets 设置为 NO,结果还是重现的……
      • 崠崠:我也碰见这个问题额,我是误打误撞直接将xib 的大小置为最小的尺寸,结果好了,感觉autolayout的坑还是挺多的,但是我没有用约束,是使用Autoresizing来设置简单的布局,所以我觉得约束应该不是必要条件吧
        戴仓薯:有道理,我改改~ 谢谢~~

      本文标题:iOS UITextView 的坑:启动时文字位置不从顶部开始

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