在viewDidLoad中设置约束激活不起作用

时间:2016-12-07 18:29:50

标签: ios nslayoutconstraint

我注意到在某些情况下,在viewDidLoad中激活约束不起作用。这是一个例子,在我的情况下应该有效,但不是,

override func viewDidLoad() {
    super.viewDidLoad()
    //constrain is not active
    constrain.active = true
    view.layoutIfNeeded()
    //constrain is active
}

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    //constrain is not active anymore
}

现在有更多的代码,我设置了很少的UIImages,UILabels,隐藏了UIViews,但没什么特别的。我似乎在使用UIScrollViewUIStackView

的观看中遇到此问题

顺便说一下,如果我拨打constrain.active = true& view.layoutIfNeeded()两次一切正常。添加无视延迟也可以解决问题

override func viewDidLoad() {
    super.viewDidLoad()
    delay(0) {
        self.buttonStackBottomConstrain.active = true
        self.view.layoutIfNeeded()
    }
}

func delay(delay:Double, closure:()->()) {
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(delay * Double(NSEC_PER_SEC))
        ),
        dispatch_get_main_queue(), closure)
}

为什么会发生这种情况的任何想法?

1 个答案:

答案 0 :(得分:0)

当调用viewDidLoad:viewWillAppear:时,该视图仍不可见,因此将代码放入viewDidAppear:可以使该视图在当时可见。添加延迟也同样有效,因为无论是哪种方式,现在都调用viewDidAppear:

  

viewDidAppear :在视图控制器的内容视图之后调用   已添加到应用的视图层次结构中。使用此方法触发   呈现视图后需要进行的任何操作   在屏幕上。此方法只是表明内容视图已被   已添加到应用的视图层次结构中。

将内容视图添加到应用的视图层次结构后,只要视图在屏幕上显示,它的所有约束都可见,可以进行修改。

生命周期方法与所有UIKit交互一样在mainThread上运行。这些方法中的任何一种延迟都会导致实际的延迟。

Apple Docs View Controller Lifecycle