UITextView在iOS7上contentOffset未初始化为CGPointZero

3
我有一个包含全屏textView的nib。在viewDidLoad中,
self.textView.attributedText = //some text;

它很简单,除了在iphone横向模式下工作良好。

在横向模式下,当我导航到此页面时,此textView的contentOffset.y未初始化为零。因此,默认情况下滚动位置位于内容的中间(我期望它位于内容的开头)。

对于iPad和iPhone纵向模式,滚动位置位于内容的开头(contentOffset.y为零)


3
或许可以将其放在viewDidLayoutSubviews方法中。 - matt
一个副作用是,每当用户在阅读内容时更改方向时,内容偏移量将被重置为零。 - db42
我建议你只做一次。 - matt
@matt 那个可以。但我仍然对这种行为很好奇。 - db42
5个回答

4
在iOS7中,要滚动到顶部,您必须考虑内容插图。我还发现有必要等待下一个运行循环迭代,就像Altaveron所说的那样。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    _textView.contentOffset = CGPointMake(-_textView.contentInset.left, -_textView.contentInset.top);
});

3
以下解决方法对我有帮助。setText 调用 UITextView 的 setText 方法。
 [self performSelector:@selector(setText) withObject:nil afterDelay:0.f];

1
它将一次调用 setText 排入下一次运行循环中,以允许其他挂起的运行循环任务先完成。我更喜欢使用以下方式: CFRunLoopPerformBlock(CFRunLoopGetMain(), kCFRunLoopDefaultMode, ^{ ... }); 这是另一种实现相同功能的方式。 - hyperspasm

3
在iOS 7中,我也遇到了同样的问题。UITextView在横向视图中从中间开始滚动。我在视图控制器顶部有navigationBar。为了解决这个问题,在viewDidLoad中设置contentOffset如下:
[self.textView setContentOffset: CGPointMake(0,-200) animated:NO];

我将减去200来使我的导航栏平衡。 这对我有用。 由于它是在viewDidLoad中设置的,如果用户更改方向,则y偏移量不会重置为0。

希望对您有所帮助!


1
在iOS8或更早版本中,使用 textView.contentOffset = CGPointZero。但是从iOS9开始,我认为我们需要在 viewDidLayoutSubviews() 中更新它。

0

我类似的问题是通过以下方式解决的:

textView.contentOffset = CGPointMake(0.0, -50)

在某些设备上,textView 最开始可能会稍微向下滚动。但我需要它滚动到最顶部。
由于某种原因,将其设置为 CGPointZero 没有任何影响。然而,将偏移量 y 设置为一个大的负数就起作用了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接