我注意到在某些情况下,在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但没什么特别的。看来我在UIScrollView
和UIStackView
的观点中一直存在这个问题
顺便说一句,如果我两次打电话给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)
}
任何想法为什么会这样?
当调用viewDidLoad:
和viewWillAppear:
时,视图尚不可见,因此将代码放入viewDidAppear:
工作,因为当时视图可见。添加延迟也适用于viewDidAppear:
被称为现在任何一种方式它是相同的事情。
viewDidAppear:在视图控制器的内容视图添加到应用程序的视图层次结构后立即调用。在屏幕上显示视图后,使用此方法可以触发需要进行的任何操作。此方法仅表示内容视图已添加到应用程序的视图层次结构中。
当内容视图已添加到应用程序的视图层次结构中时,只要在屏幕上显示视图,就可以看到所有约束都可以修改。
生命周期方法和所有UIKit交互一样在mainThread上运行。任何这些方法的延迟都会导致实际的延迟。