iOS UITextView 的坑:启动时文字位置不从顶部开始
2017-02-07 本文已影响1025人
戴仓薯
问题描述
今天有个同学发了一个很简单的 demo。里面只有一个 viewController,里面只有一个用 autoLayout 约束、充满屏幕的 UITextView,UITextView 里面充满了大段文字(大概是 UITextView 高度的三倍)。xib 的预览尺寸选的是 View as: iPhone 7,然后运行在 iPhone 5s 或 SE 的模拟器上,发现 UITextView 自动滚动到了中间位置,而不像正常一样是从顶部开始的。
问题原因
经过反复尝试,发现出现问题的必要条件如下:
- 用 autoLayout 约束,或用 autoResizing 并配置为缩放。
- 在实际运行时,UITextView 的尺寸相比在 xib 里是缩小,而不是放大。
看起来像是 autoLayout 带来的一个系统 bug。
解决方法
正常的解决方法:
- 此处放弃使用 autoLayout 或 autoResizing 的缩放;
- 用代码手动调整一下 contentOffset,比如在
viewDidLayoutSubviews
里:
- (void)viewDidLayoutSubviews {
[self.textView setContentOffset:CGPointZero animated:NO];
}
hacky 的解决方法:
在 xib 里把 UITextView 的尺寸手动拉小,不去管黄色的 warning;或者 View as 选最小的一个屏幕尺寸。这样在运行时,UITextView 只会放大,不会缩小,问题也就消失了。不过,不能防止日后同事或者自己忘记了这一点,不小心改了回来,问题还会出现。
所以,我们还是尽量选择正常的解决方法吧~