这看起来应该是一个简单的任务,但是有没有办法以编程方式告诉 NSLayoutConstraint
是水平约束还是垂直约束?
我能想到的尝试改变这种差异的唯一方法是调用 [constraint description];
然后在结果字符串中搜索 "V:"
或 “H:”
我想找到这些信息的原因是我在 storyboard
上的 prototype
UITableViewCell
上设置了 2 个几乎相同的约束,唯一的区别在于一个描述了与 superview
的水平距离,另一个描述了垂直距离。我想删除垂直的、以编程方式添加的约束,以描述在给定从我的服务器返回的特定参数的情况下添加的新 View 。
任何建议都会非常有帮助!
编辑:
我接受了 greymouser 的回答,因为他的解释是一个很好的答案,也是我最终解析描述的方式,但也想感谢@kongtomorrow,他也在 greymouser 在这里回答我之前通过推特提出了这个答案!感谢您的帮助!
这是我用来查找约束的实际代码:
NSArray *constraints = [bubble constraints];
for (NSLayoutConstraint *constraint in constraints) {
if ([[constraint firstItem] isEqual:messageLabel] && [[constraint secondItem] isEqual:bubble] && [constraint secondAttribute] == NSLayoutAttributeTop) {
[bubble removeConstraint:constraint];
}
}
以上匹配约束的 firstItem、secondItem 和 secondAttribute 以合理确定地确认我正在查看正确的约束,然后我删除它并在之后成功添加我的新约束描述!
最佳答案
不是真的。 VFL
映射到底层 NSLayoutConstraint +:constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:
调用。
但是,如果您检查约束上的 firstAttribute 或 secondAttribute NSLayoutAttribute
属性,您可能能够推断出它是水平的还是垂直的。如果您从 VFL
生成约束,它们可能不会非常复杂,因此这可能是一个简单的推论例如,如果您遇到父 View 上的 firstAttribute 设置为 NSLayoutAttributeLeft
并且 subview 的 secondAttribute 是 NSLayoutAttributeLeft
,那么它可能是水平的。但只是可能。
您可能只想坚持解析描述,可能子类化 NSLayoutConstraint
以添加水平/垂直属性,或者为记录 H 或 V 的字典中的每个约束维护辅助数据。
关于ios - 如何判断 NSLayoutConstraint 是水平的还是垂直的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21842693/