如何激活以前停用的约束?

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 约束未更新

自动旋转时自动布局约束更新

NSLayoutConstraint 激活/停用

如何停用我的约束?

如何强制 uitableview 调整单元格的大小(在停用高度约束后)?

重新限制 UIButton 的宽度