IOS bug约束ViewDidAppear vs ViewDidLoad

时间:2015-10-16 07:14:47

标签: ios swift constraints break viewdidappear

我对这个问题进行了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

1 个答案:

答案 0 :(得分:1)

希望这会对你有所帮助

viewDidAppear is called finally after UIKit laid out sub views and displayed them.

所以它不起作用,您可以考虑在添加/删除约束后重新布局视图控制器的另一种方法。

尝试setNeedsUpdateConstraints或其他东西