我注意到在某些情况下,在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)
}
为什么会发生这种情况的任何想法?
答案 0 :(得分:0)
当调用viewDidLoad:
和viewWillAppear:
时,该视图仍不可见,因此将代码放入viewDidAppear:
可以使该视图在当时可见。添加延迟也同样有效,因为无论是哪种方式,现在都调用viewDidAppear:
。
viewDidAppear :在视图控制器的内容视图之后调用 已添加到应用的视图层次结构中。使用此方法触发 呈现视图后需要进行的任何操作 在屏幕上。此方法只是表明内容视图已被 已添加到应用的视图层次结构中。
将内容视图添加到应用的视图层次结构后,只要视图在屏幕上显示,它的所有约束都可见,可以进行修改。
生命周期方法与所有UIKit交互一样在mainThread上运行。这些方法中的任何一种延迟都会导致实际的延迟。