UIScrollView 在 vi​​ewDidLoad 中调用 setContentSize 后没有更新,但从按钮调用时会更新

Posted

技术标签:

【中文标题】UIScrollView 在 vi​​ewDidLoad 中调用 setContentSize 后没有更新,但从按钮调用时会更新【英文标题】:UIScrollView not updating after calling setContentSize in viewDidLoad, but does when called from a button 【发布时间】:2014-04-23 04:41:55 【问题描述】:

我有一个ViewController 和一个UIScrollView,其中包含一个包含可变大小内容的View

- ViewController
    -ScrollView
        -View
            -label1
            -label2
            - ...

当调用控制器的viewDidLoad 时,我将UIScrollView 的内容大小设置为适当的高度,但视图不会滚动。如果我从按钮上的操作调用同一行,它会更新 contentSize 并正确滚动。我正在使用autolayout。知道为什么以及如何解决它吗?

视图不会滚动:

- (void)viewDidLoad

    [super viewDidLoad];

    [_scrollView setContentSize:CGSizeMake(100,500)];

视图将正确滚动:

- (IBAction)test:(id)sender 

    [_scrollView setContentSize:CGSizeMake(100,500)];

【问题讨论】:

【参考方案1】:

ViewDidAppear 也保证你的视图已经被加载和初始化但是 viewdidAppear 在 vi​​ewDidLayoutSubviews 之后触发。如果你在 ViewDidLoad Realted 中对 UI 进行大量编码,你的 ViewController 会延迟显示

-(void)viewDidAppear:(BOOL)animated

    [super viewDidAppear:NO];
    [_scrollView setContentSize:CGSizeMake(100,500)];

【讨论】:

一点修正,[super viewDidAppear:animated];viewDidLoad 也保证视图被加载和初始化。但是 viewdidAppear 在viewDidLayoutSubviews 之后触发 哇,感谢修复它,我不敢相信我没有想到这一点。将 viewDidLoad 保持在最低限度似乎也是一种好习惯。我会尽快接受这个答案(5 分钟)【参考方案2】:

不要在viewDidLoad 中设置内容大小。在viewDidAppear做吧

【讨论】:

【参考方案3】: 视图控制器 -滚动视图 -看法 -标签1 -label2

第一个 ScrollView 添加新的约束,下一个 label1 和 label2 添加约束,然后最终的 View 视图可以添加约束。

【讨论】:

以上是关于UIScrollView 在 vi​​ewDidLoad 中调用 setContentSize 后没有更新,但从按钮调用时会更新的主要内容,如果未能解决你的问题,请参考以下文章

七月第四周总结

UIScrollView 内 UIScrollView 内 UIScrollView

UIScrollView 内的 UIScrollView 时滚动

以编程方式具有自动布局的滚动视图

如何以编程方式在 UIScrollview 中创建 UIScrollview

带有内容框架更新关闭的 SwiftUI ScrollView