我在这个问题上工作了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
希望对你有帮助
<>之前viewDidAppear在UIKit布局子视图并显示它们之后被最终调用。所以它不工作,你可以考虑另一种方式来重新布局你的视图控制器后添加/删除约束。
尝试setNeedsUpdateConstraints或其他