UITextView contentOffset 在 vi​​ewDidLoad 和 viewDidAppear 之间变化

UITextView contentOffset changes between viewDidLoad and viewDidAppear

在 iOS 8 上(我没有在 iOS 7 上测试过)我有一个 UITextView,它的文本设置在故事板中。当视图实际出现时,文本出现滚动,我不希望它滚动。事实上,我不知道为什么有人会这样做。任何人都可以解释如何更改此行为,使其显示为应该滚动到顶部吗?

这非常容易重现:

  1. 开始一个新项目
  2. 添加一个带有约束的 UITextView 以将其粘在边距上
  3. 用超出其边界的更多文本填充它(有助于将字体大小增加到大约 36)。
  4. 运行.

它在视觉上很明显,但是如果您记录正在发生的事情,您将看到类似以下内容:

2015-03-10 10:34:47.198 ScrollViewTest[61180:2610445] [Inside viewDidLoad] <UITextView: 0x7f9c79851200; frame = (0 0; 600 600); text = 'Lorem ipsum dolor sit er ...'; clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7f9c78c89df0>; layer = <CALayer: 0x7f9c78c8c220>; contentOffset: {0, 0}; contentSize: {600, 592}>
2015-03-10 10:34:47.288 ScrollViewTest[61180:2610445] [Inside viewDidAppear] <UITextView: 0x7f9c79851200; frame = (0 0; 375 667); text = 'Lorem ipsum dolor sit er ...'; clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7f9c78c89df0>; layer = <CALayer: 0x7f9c78c8c220>; contentOffset: {0, 457.5}; contentSize: {375, 1176}>

推测这是因为 frame and/or contentSize 从故事板的初始加载到它需要显示的实际尺寸。

这似乎与 UITextView contentOffset is set 相似,但该问题的公认答案无效。设置self.automaticallyAdjustsScrollViewInsets = NO.

也解决不了这个问题

我的猜测是,当应用自动布局时,内容偏移被破坏了。这发生在执行 -layoutSubviews 之前。

所以要解决这个问题,我可以推荐两个解决方案。

  1. 子类 UITextView 并在 -layoutSubviews 中设置 contentOffset
  2. -viewDidLayoutSubviews 添加到您的视图控制器并为那里的任何文本视图设置 contentOffset

这两种解决方法都比较棘手,但比 -viewDidAppear:dispatch_async() 更好。


注意:注意确保只在适当的时候调整-layoutSubviews-viewDidLayoutSubviews中的contentOffset

我遇到了同样的问题。我通过在 viewDidAppear

中添加 1 行代码来摆脱它
[yourTextView setContentOffset: CGPointMake(0,0) animated:NO];

你可以随心所欲地玩 CGPointMake 但这对我很有效。 希望这有帮助。