UITextView contentOffset 在 viewDidLoad 和 viewDidAppear 之间变化
UITextView contentOffset changes between viewDidLoad and viewDidAppear
在 iOS 8 上(我没有在 iOS 7 上测试过)我有一个 UITextView
,它的文本设置在故事板中。当视图实际出现时,文本出现滚动,我不希望它滚动。事实上,我不知道为什么有人会这样做。任何人都可以解释如何更改此行为,使其显示为应该滚动到顶部吗?
这非常容易重现:
- 开始一个新项目
- 添加一个带有约束的
UITextView
以将其粘在边距上
- 用超出其边界的更多文本填充它(有助于将字体大小增加到大约 36)。
- 运行.
它在视觉上很明显,但是如果您记录正在发生的事情,您将看到类似以下内容:
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
之前。
所以要解决这个问题,我可以推荐两个解决方案。
- 子类
UITextView
并在 -layoutSubviews
中设置 contentOffset
。
- 将
-viewDidLayoutSubviews
添加到您的视图控制器并为那里的任何文本视图设置 contentOffset
。
这两种解决方法都比较棘手,但比 -viewDidAppear:
或 dispatch_async()
更好。
注意:注意确保只在适当的时候调整-layoutSubviews
或-viewDidLayoutSubviews
中的contentOffset
。
我遇到了同样的问题。我通过在 viewDidAppear
中添加 1 行代码来摆脱它
[yourTextView setContentOffset: CGPointMake(0,0) animated:NO];
你可以随心所欲地玩 CGPointMake
但这对我很有效。
希望这有帮助。
在 iOS 8 上(我没有在 iOS 7 上测试过)我有一个 UITextView
,它的文本设置在故事板中。当视图实际出现时,文本出现滚动,我不希望它滚动。事实上,我不知道为什么有人会这样做。任何人都可以解释如何更改此行为,使其显示为应该滚动到顶部吗?
这非常容易重现:
- 开始一个新项目
- 添加一个带有约束的
UITextView
以将其粘在边距上 - 用超出其边界的更多文本填充它(有助于将字体大小增加到大约 36)。
- 运行.
它在视觉上很明显,但是如果您记录正在发生的事情,您将看到类似以下内容:
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
之前。
所以要解决这个问题,我可以推荐两个解决方案。
- 子类
UITextView
并在-layoutSubviews
中设置contentOffset
。 - 将
-viewDidLayoutSubviews
添加到您的视图控制器并为那里的任何文本视图设置contentOffset
。
这两种解决方法都比较棘手,但比 -viewDidAppear:
或 dispatch_async()
更好。
注意:注意确保只在适当的时候调整-layoutSubviews
或-viewDidLayoutSubviews
中的contentOffset
。
我遇到了同样的问题。我通过在 viewDidAppear
[yourTextView setContentOffset: CGPointMake(0,0) animated:NO];
你可以随心所欲地玩 CGPointMake
但这对我很有效。
希望这有帮助。