无法获取 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。例如,如果A
是B
的父视图,并且您有一个相同宽度的约束,那么该约束将添加到A
并且不会出现在B
上。
仅当some2
是some
的子视图时,才会将约束添加到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 的类