无法获取 NSLayoutConstraint 的约束

Posted

技术标签:

【中文标题】无法获取 NSLayoutConstraint 的约束【英文标题】:Unable to get constraints of NSLayoutConstraint 【发布时间】:2017-09-21 20:10:17 【问题描述】:

这是我的代码:

let b = NSLayoutConstraint(item: some, attribute: fromAttribute, relatedBy: NSLayoutRelation.equal, toItem: some2, attribute: toAttribute, multiplier: multiplier, constant: -5)
b.isActive = true
self.layoutIfNeeded()
print(b.constant)
print(some.constraints.first(where: $0.constant == -5 ))

这是我的印刷品:

-5.0
nil

如何在代码中恢复该约束?为什么它打印出零?我想稍后为约束的常量设置动画。谢谢。

【问题讨论】:

使其成为类级别的变量/属性,而不是局部范围的变量。 @DonMag 您认为会有所不同吗?你的意思是变量 B 类级别的变量对吗? 约束已添加到some,您现在如何?请向我们展示视图层次结构。如果some2 不是some 的子视图,那么这不起作用。 【参考方案1】:

让我们从核心问题开始:

如何在代码中恢复该约束?

理想情况下,您不需要。创建时将其保存到变量中,例如:

var myConstraint: NSLayoutConstraint?

func x() 
   let b = NSLayoutConstraint(...)
   ...
   myConstraint = b

为什么打印出 nil?

当设置isActive = true 时,约束被添加到最近的公共superview。例如,如果AB 的父视图,并且您有一个相同宽度的约束,那么该约束将添加到A 并且不会出现在B 上。

仅当some2some 的子视图时,才会将约束添加到some

【讨论】:

是的,我只是在阅读您的评论,我想它可能已添加到我的超级视图 (some2) 中。好吧,那又是一个小时让我头疼>:(【参考方案2】:

使用类级变量来保存要修改的约束。如果您使用故事板/界面生成器,您还可以将约束分配为 IBOutlet。

class ViewController: UIViewController 

    var constraintToAnimate: NSLayoutConstraint?

    override func viewDidLoad() 
        super.viewDidLoad()

        constraintToAnimate = NSLayoutConstraint(item: some, attribute: fromAttribute, relatedBy: NSLayoutRelation.equal, toItem: some2, attribute: toAttribute, multiplier: multiplier, constant: -5)
        constraintToAnimate.isActive = true

    

    // later, perhaps in a button tap...

    func animateIt() 

        constraintToAnimate?.constant = 100

    


【讨论】:

以上是关于无法获取 NSLayoutConstraint 的约束的主要内容,如果未能解决你的问题,请参考以下文章

NSLayoutConstraint - 无法将子视图框架设置为父视图边界

NSInvalidUnarchiveOperationException:无法实例化名为 NSLayoutConstraint 的类

获取 NSLayoutConstraint 标识符不适用于 topAnchor

在 NSLayoutConstraint 上更新“常量”失败,并显示“无法分配给 'constraint' 中的 'constant'”

错误:NSInvalidUnarchiveOperationException:无法实例化名为 NSLayoutConstraint 的类

NSLayoutConstraint 设置