添加、重用和删除 NSLayoutAnchors

Posted

技术标签:

【中文标题】添加、重用和删除 NSLayoutAnchors【英文标题】:Adding, reusing and removing NSLayoutAnchors 【发布时间】:2016-05-01 21:00:10 【问题描述】:

所以我有一个 container 视图(停靠在屏幕边缘)和一个 child 视图应该可以滑入和滑出。 p>

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)) 的数量就会增加,这不是一件好事。

所以我的问题是:

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

【问题讨论】:

【参考方案1】:

constraintEqualToAnchor 方法创建一个新的约束。 因此,当您在滑出函数中调用 self.container.bottomAnchor.constraintEqualToAnchor(self.child.bottomAnchor) 时,您并没有使用您在 slideIn 方法中添加的约束。

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

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 文档:

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

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

【讨论】:

我试图通过使用锚更新其最新的子视图底部约束来更改 UIScrollView contentSize。停用、更改和重新激活它就可以了。感谢您的回答,因为如果没有它,您将很难猜到该怎么办。

以上是关于添加、重用和删除 NSLayoutAnchors的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 动画可重用单元格?

单元重用后如何恢复CAAnimation组?

在运行时重用具有动态布局内容的单元格

在“删除”之后重用指针

在 For Get 和 POST 中重用相同的域对象

添加或删除对象的动画