IOS bug constraints ViewDidAppear vs ViewDidLoad



我在这个问题上工作了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或其他

最新更新