【问题标题】:Call method once after viewDidLayoutSubviews在 viewDidLayoutSubviews 之后调用一次方法
【发布时间】:2017-06-01 18:44:41
【问题描述】:

我需要一点帮助来理解viewDidLAyoutSubviews方法以及如何安全地使用它。

我需要在viewDidAppear 方法之前以编程方式编辑我的一些子视图。为了让它正常工作,我当然需要等到目标子视图布局好后再编辑它们。

现在我认为这就是 viewDidLayoutSubviews 方法的用途,但是当我测试它时,我发现它实际上在我的 viewDidAppear 方法之前被调用了两次。我只在第一次调用viewDidLayoutSubviews 时尝试编辑我的子视图,因为我只想运行一次[self editMySubviews],但是目标子视图还没有准备好并且它搞砸了。我就是这样尝试的:

- (void)viewDidLayoutSubviews {
    if (!myBoolean) {
        [self editMySubviews];
        myBoolean = YES;
    }
}

当然,如果我删除if-statement,它会在下次调用该方法时自行修复,但我只想调用一次[self editMySubviews]

所以我的问题是,什么时候我可以在viewDidAppear 方法之前调用[self editMySubviews] 方法,并且100% 确定所有子视图都准备好进行编辑?现在在我的情况下,viewDidLayoutSubviewsviewDidAppear 之前被调用了两次,但每次都会这样吗?在第二次调用viewDidLayputSubviews 之后再调用[self editMySubviews] 是否安全?

【问题讨论】:

  • 你在editMySubviews做什么?
  • 根据不同设备上不同的superView.frame.size.width编辑一些按钮约束
  • 那你为什么只需要做一次呢?每次子视图布局时都应该这样做,以防超级视图大小发生变化。
  • 因为我想控制它何时被调用,我不希望它在每次子视图更改时都被调用。
  • viewDidLayoutSubviews 多次调用布局中的单个更改您无法确定哪个调用给出了正确的结果,所以让它保持原样让它多次调用没有问题。

标签: ios objective-c


【解决方案1】:

根据你说的评论

根据不同设备的superView.frame.size.width编辑一些按钮约束

在 viewdidload 之后,你会从 view.bounds 得到合适的尺寸 因此您可以轻松设置/更新约束并在此结束时添加
setNeedsUpdateConstraints 和 layoutIfNeeded 方法调用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 2022-11-17
    • 2014-06-20
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多