强制布局发生以保证布局完成后宽度不会改变

Posted

技术标签:

【中文标题】强制布局发生以保证布局完成后宽度不会改变【英文标题】:Force layout to occur to guarantee the width won't change after layout finishes 【发布时间】:2015-03-07 23:56:44 【问题描述】:

我正在以编程方式在viewDidLoad 中创建UICollectionView,然后对其设置自动布局约束。我需要确切知道集合视图在向用户显示后的宽度,但我需要 viewDidLoad 中的信息(不能使用 willLayoutSubviews 等)。

如何强制进行布局,以便我可以保证宽度将更新为viewDidLoad 中的实际宽度?

//viewDidLoad:
let collectionView = //...
self.view.addSubview(collectionView)
//add constraints here
let wid = collectionView.frame.size.width //0

//viewDidAppear:
let wid = collectionView.frame.size.width //603

我曾尝试致电self.view.layoutSubviews(),但这并没有完全解决问题。它将 wid 更改为 720 而不是 0,但这是不正确的。

我在 Today 扩展中尝试这样做,这可能与传统的视图控制器不同。

【问题讨论】:

【参考方案1】:

使用viewWillAppear:。视图将加载正确的框架,然后您可以在视图实际显示之前创建集合视图。

【讨论】:

我不能使用willWillAppear,因为这会影响我的扩展程序的行为。我根据宽度更改的内容必须在viewWillAppear之前设置,并且只设置一次。 您是否将宽度设置为某个值?或者您是否根据周围的视图设置自动布局约束? 在使用集合视图宽度执行计算后,我正在更改自动布局约束常量。在viewWillAppear 中这样做的不良行为是扩展在加载时会增加高度,然后一旦加载完成就会收缩。我需要提前设置它,所以它始终是相同的高度。 集合视图的宽度是动态的 - 无论今天视图的宽度对于它正在运行的设备来说是什么(它有前导和尾随到超级视图。 同样在 iPad 上,viewWillAppear 中报告的宽度不是 viewDidAppear 中报告的宽度 - 相差不少。

以上是关于强制布局发生以保证布局完成后宽度不会改变的主要内容,如果未能解决你的问题,请参考以下文章