获取 NSLayoutConstraint 标识符不适用于 topAnchor
Posted
技术标签:
【中文标题】获取 NSLayoutConstraint 标识符不适用于 topAnchor【英文标题】:Get NSLayoutConstraint Identifier is not working for topAnchor 【发布时间】:2019-07-19 17:30:07 【问题描述】:我想在运行时更改一些 View 的 TopAnchor 约束。
已创建约束:
self.buttonHStack.topAnchor.constraint(equalTo: cellHStack.bottomAnchor , constant: 20).activate(withIdentifier: "topAnchor")
扩展
extension UIView
func getConstraint(withIndentifier indentifier: String) -> NSLayoutConstraint?
return self.constraints.filter $0.identifier == indentifier .first
extension NSLayoutConstraint
func activate(withIdentifier identifier: String)
self.identifier = identifier
self.isActive = true
用法
self.myStackView.topAnchor.constraint(equalTo: someView.bottomAnchor , constant: 20).activate(withIdentifier: "topAnchor")
但是当我尝试获取它的参考时:
if let filteredConstraint = self.myStackView.getConstraint(withIndentifier: "topAnchor")
//Edit here
它不会进入区块
【问题讨论】:
两个视图之间的约束,被添加到两个视图的父级你需要self.myStackView.superView?.getConstraint(withIndentifier: "topAnchor")
【参考方案1】:
问题是您在错误的视图上调用getConstraint
。当您激活myStackView
和其他视图之间的约束时:
self.myStackView.topAnchor.constraint(
equalTo: someView.bottomAnchor , constant: 20).activate(withIdentifier: "topAnchor")
...该约束属于myStackView
和someView
的公共superview。所以当你说
self.myStackView.getConstraint(withIndentifier: "topAnchor")
...它不存在。你在错误的视图中寻找你的约束。
但是您的getConstraint
方法(显然取自here)是个好主意,所以让我们更正确(更优雅)地重写它,以便我们沿着视图层次结构寻找约束:
extension UIView
func constraint(withIdentifier id: String) -> NSLayoutConstraint?
return self.constraints.first $0.identifier == id ??
self.superview?.constraint(withIdentifier: id)
现在(当然是更改名称)即使您在 myStackView
上调用它,您的方法调用也将起作用。
【讨论】:
以上是关于获取 NSLayoutConstraint 标识符不适用于 topAnchor的主要内容,如果未能解决你的问题,请参考以下文章
如何修改NSLayoutConstraint的multiplier