我对这个问题进行了2天的工作而没有理解它背后的精神错误...... 所以为了快速解释,我在另一个故事板中创建一个基于Nib的视图,如下所示:
let storyboard = UIStoryboard(name: "TestNib", bundle: nil)
testNib = storyboard.instantiateViewControllerWithIdentifier("TestNib") as! TestNib
testNib.view.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(testNib.view)
我用constraintsWithVisualFormat手动添加一些约束:
constraint_V = NSLayoutConstraint.constraintsWithVisualFormat(
"V:|-(10)-[conversationMenu(300)]",
options: NSLayoutFormatOptions(rawValue: 0),
metrics: nil, views: ["conversationMenu": testNib.view])
let constraint_H = NSLayoutConstraint.constraintsWithVisualFormat(
"H:|[conversationMenu]|",
options: NSLayoutFormatOptions(rawValue: 0),
metrics: nil, views: ["conversationMenu": testNib.view])
self.view.addConstraints(constraint_V)
self.view.addConstraints(constraint_H)
没问题,一切都很好。 (顺便说一下,我也试着在故事板中查看)。
主要问题是当我想要为此视图设置动画时,约束为“testNib”(self.view.addSubview(testNib.view))会中断。这发生在我在ViewDidAppear中创建constraintsWithVisualFormat时。在ViewDidLoad中,一切都很完美...
这是我的实例变量:
var testNib: TestNib!
var constraint_V: [NSLayoutConstraint]!
var completion = false
这是我制作约束动画的代码:
if completion == false {
for constraint in constraint_V {
if constraint.firstAttribute == NSLayoutAttribute.Top {
constraint.constant = -200
}
}
} else {
for constraint in constraint_V {
if constraint.firstAttribute == NSLayoutAttribute.Top {
constraint.constant = 10
}
}
}
completion = !completion
UIView.animateWithDuration(1, animations: {
self.view.layoutIfNeeded()
}, completion: {(value: Bool) in
})
您会问我,为什么如果它在ViewDidLoad中工作,您根本就不使用它? 这是因为我的主要问题是当我“presentViewController”并解除它时,约束再次中断,我发现重现此错误的唯一方法是将我的初始化插入到ViewDidAppear中。
如果你想和我一起测试,我已经提交并将我的代码推送到github:https://github.com/Comanga/Bug-Constraints。
您需要看到的是绿色视图不再被卡在顶部约束中。
哦,你读到这个直到这行吗?谢谢你< 3
iOS9 - SWIFT 2.0
答案 0 :(得分:1)
希望这会对你有所帮助
viewDidAppear is called finally after UIKit laid out sub views and displayed them.
所以它不起作用,您可以考虑在添加/删除约束后重新布局视图控制器的另一种方法。
尝试setNeedsUpdateConstraints或其他东西