【问题标题】:Unable to get constraints of NSLayoutConstraint无法获取 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 的子视图,那么这不起作用。

标签: ios swift autolayout nslayoutconstraint


【解决方案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

    }

}

【讨论】:

    猜你喜欢
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 2016-12-27
    相关资源
    最近更新 更多