UITextView contentOffset在viewDidLoad和viewDidAppear之间切换

col*_*ash 4 cocoa-touch objective-c uitextview ios

在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}>
Run Code Online (Sandbox Code Playgroud)

据推测,这是因为从故事板的初始负载到需要显示的实际尺寸的变化frame和/或contentSize变化.

这看起来类似于UITextView contentOffset设置,但该问题的接受答案不起作用.设置也无法解决这个问题self.automaticallyAdjustsScrollViewInsets = NO.

Jef*_*mas 7

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

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

  1. 子类UITextView,并设置contentOffset-layoutSubviews.
  2. 添加-viewDidLayoutSubviews到视图控制器并contentOffset为其设置任何文本视图.

这些都是一种hacky变种,但是比ha -viewDidAppear:或者更好的hacky变通办法dispatch_async().


注意:小心,以确保您只调整contentOffset-layoutSubviews-viewDidLayoutSubviews在适当的时候.