UITextView contentOffset在viewDidLoad和viewDidAppear之间切换

时间:2015-03-10 14:51:32

标签: ios objective-c cocoa-touch uitextview

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

这非常容易重现:

  1. 开始一个新项目
  2. 添加带有约束的UITextView以将其粘贴到边距
  3. 用更多的文字填充它的边界(有助于将字体大小增加到36)。
  4. 运行。
  5. 它立即在视觉上很明显,但如果您记录正在发生的事情,您将看到如下内容:

    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和/或contentSize从故事板的初始加载更改为需要显示的实际尺寸。

    这似乎与UITextView contentOffset is set类似,但该问题的公认答案不起作用。设置self.automaticallyAdjustsScrollViewInsets = NO

    也无法解决此问题

2 个答案:

答案 0 :(得分:7)

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

因此,为了解决这个问题,我可以推荐两种解决方案。

  1. 子类UITextView并在contentOffset中设置-layoutSubviews
  2. -viewDidLayoutSubviews添加到您的视图控制器,并为其中的任何文本视图设置contentOffset
  3. 这些都是一些hacky变通方法,但是比-viewDidAppear:dispatch_async()更好的hacky变通办法。


    注意:请务必确保仅在适当时调整contentOffset-layoutSubviews中的-viewDidLayoutSubviews

答案 1 :(得分:0)

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

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

您可以随意使用CGPointMake,但这对我很有帮助。 希望这会有所帮助。