添加,重用和删除NSLayoutAnchors

时间:2016-05-01 21:00:11

标签: ios swift autolayout swift2

所以我有一个容器视图(停靠在屏幕边缘)和一个视图,它应该滑入和滑出它。

func slideOut() {
    UIView.animateWithDuration(Double(0.5), animations: {
        self.container.bottomAnchor
               .constraintEqualToAnchor(self.child.bottomAnchor).active = false
        self.view.layoutIfNeeded()
    })
}

func slideIn() {
    UIView.animateWithDuration(Double(0.5), animations: {
        self.container.bottomAnchor
               .constraintEqualToAnchor(self.child.bottomAnchor).active = true
        self.view.layoutIfNeeded()
    })
    print("numConstraints: \(container.constraints.count)")
}

slideIn()动画很好,就像它应该的那样。问题是我不知道如何做slideOut()动画。如果我只是停用上面的NSLayoutConstraint,那么没有任何反应。如果相反,我尝试:

self.container.bottomAnchor
       .constraintEqualToAnchor(self.child.topAnchor).active = true

然后有一个关于无法同时满足约束的警告在视觉上没有任何结果。 此外,每当我激活NSLayoutConstraint时,约束的数量(print(container.constraints.count))都会增加,这不是一件好事。

所以我的问题是:

  1. 在这种情况下如何反转slideIn()动画?
  2. 如果重复动画,如何重用现有约束,以便约束的数量不会累加?

1 个答案:

答案 0 :(得分:12)

constraintEqualToAnchor方法创建一个新约束。 因此,当您在幻灯片放映功能中调用self.container.bottomAnchor.constraintEqualToAnchor(self.child.bottomAnchor)时,您并未使用slideIn方法中添加的约束。

要实现所需的滑出动画,您必须保留对先前约束的引用。我不确定在约束中设置.active属性的效果在滑出功能中是什么,因为我不知道您的视图层次结构是如何设置的。 但是重用约束的一种方法是将它作为VC中的var属性保存:

lazy var bottomConstraint:NSLayoutConstraint = self.container.bottomAnchor
        .constraintEqualToAnchor(self.child.bottomAnchor)

func slideOut() {
    UIView.animateWithDuration(Double(0.5), animations: {
        self.bottomConstraint.active = false
        self.view.layoutIfNeeded()
    })
}

func slideIn() {
    UIView.animateWithDuration(Double(0.5), animations: {
        self.bottomConstraint.active = true
        self.view.layoutIfNeeded()
    })
    print("numConstraints: \(container.constraints.count)")
}

来自Apple Docs:

  

激活或取消激活约束调用addConstraint:和removeConstraint:在视图上,该视图是此约束管理的项目的最近共同祖先。

因此,您为什么要增加约束数量的原因是因为您不断创建新约束并通过将active设置为true来添加它们。