如何激活以前停用的约束?
Posted
技术标签:
【中文标题】如何激活以前停用的约束?【英文标题】:How can I activate, previously deactivated constraint? 【发布时间】:2015-07-11 14:57:28 【问题描述】:我保留对我的NSLayoutConstraint
的引用
var flag = true
@IBOutlet weak var myConstraint: NSLayoutConstraint!
然后对于一些@IBAction
,我根据我的flag
变量激活/停用:
@IBAction func tapped(sender: UIButton)
flag = !flag
UIView.animateWithDuration(1.0)
if self.flag
NSLayoutConstraint.activateConstraints([self. myConstraint])
else
NSLayoutConstraint.deactivateConstraints([self. myConstraint])
但是当我再次调用我的操作时,myConstrain
出现错误 unexpectedly found nil while unwrapping an Optional value
。
更多的是它没有动画。我做错了什么?
我遵循 WWDC 2015 的教程:
【问题讨论】:
在 IBOutlet 声明中保持对象的强引用。@IBOutlet strong var myConstraint: NSLayoutConstraint!
甘道夫的评论是正确的。停用约束必须导致视图层次结构释放它对它的所有权。如果您不保留强引用,它将被释放。 @Gandalf,您应该将此作为答案,以便 OP 可以接受。
【参考方案1】:
取消激活约束与为视图调用removeConstraint:
相同。请参阅documentation。因此,当您删除具有 weak
引用的对象时,将导致对象释放。现在这个对象是nil
并且激活它根本不会有任何效果。要解决这个问题,您需要对约束对象有一个强引用。
@IBOutlet strong var myConstraint: NSLayoutConstraint!
【讨论】:
为什么我改这个的时候没有动画? 哦,我知道了,我应该加self.view.layoutIfNeeded()
如果您尝试使弱 IBOutlet 变强,IDE 会出错。
我在 Xcode 8.3.3 中使用 IB 在 ViewController 中定义了一个强插座,而 IDE 只是删除了弱属性(不添加强属性)。所以上面的代码应该写成@IBOutlet var myConstraint: NSLayoutConstraint!
,作为一个强有力的参考。我可以确认它似乎有效。以上是关于如何激活以前停用的约束?的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionReusableView 约束未更新