UIStackView 竞争条件?

UIStackView race condition?

我有一个嵌套的 UIStackView,当我按下一个按钮时,它会被实例化。为了更详细地说明,我有一个 UIStackView,它遍历一个充满 CustomUIStackView 的 NSMutableArrayList,并将它们添加为 arrangedSubview。当 CustomUIStackViews 启动时,它们还遍历自己的 NSMutableArrayList,其中填充了 UIViews 并将它们添加为 arrangedSubviews。

奇怪的是,在执行完所有 for 循环后,我有一个 NSLog:

NSLog(@"parentstackview height is %f",_parentStackView.frame.size.height);

which returns a 0(它不应该,高度应该是 1861 在所有堆栈视图出现后,他们在模拟器中明显地显示)。

但是如果我创建这个方法:

- (void)testMethod{
    NSLog(@"parentstackview height is %f",_parentStackView.frame.size.height);
}

并将之前的 NSLog 替换为:

[self performSelector:@selector(testMethod) withObject:nil afterDelay:1.0];

然后它 returns 1861 完全像它应该的那样,在 1 秒延迟之后。

为什么 1 秒的延迟会有所不同?

布局传递可能不是在您的代码中完成的,而是稍后在 运行 循环中处理的,这说明了不同的值。

如果您在实例化嵌套堆栈视图的同一代码中需要大小,则需要调用 layoutIfNeeded() 立即布局所有子视图。

您不会在 UIStackView 文档中找到这些详细信息,因为它记录在布局子视图下的堆栈视图的超类 UIView class reference 中。