UIStackView竞争条件?

时间:2016-02-25 18:44:08

标签: ios objective-c autolayout uistackview

我有一个嵌套的UIStackView,当我按下一个按钮时,它被实例化了。为了更详细,我有一个UIStackView,它遍历一个充满CustomUIStackViews的NSMutableArrayList,并将它们作为arrangeSubviews添加。当CustomUIStackViews启动时,它们也会迭代填充UIViews的自己的NSMutableArrayList,并将它们添加为arrangeSubviews。

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

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

返回0(它不应该,所有堆栈视图出现后高度应该是1861,它们在模拟器中可见)。

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

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

并用以下代码替换之前的NSLog:

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

然后它会在1秒延迟后返回1861,就像它应该的那样。

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

1 个答案:

答案 0 :(得分:3)

布局通行证可能未在您的代码中完成,但稍后会在运行循环中处理,这会导致不同的值。

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

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