【问题标题】:UIStackView race condition?UIStackView 竞争条件?
【发布时间】:2016-02-25 18:44:07
【问题描述】:

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

奇怪的是,在我所有的 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 秒的延迟会产生影响?

【问题讨论】:

    标签: ios objective-c autolayout uistackview


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多