【问题标题】: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 扩展中尝试这样做,这可能与传统的视图控制器不同。

【问题讨论】:

    标签: ios swift ios-app-extension ios8-today-widget


    【解决方案1】:

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

    【讨论】:

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