如何确定 NSLayoutConstraint 是水平的还是垂直的?
Posted
技术标签:
【中文标题】如何确定 NSLayoutConstraint 是水平的还是垂直的?【英文标题】:How to determine if NSLayoutConstraint is horizontal or vertical? 【发布时间】:2014-02-18 01:32:35 【问题描述】:这似乎应该是一项简单的任务,但是有没有办法以编程方式判断 NSLayoutConstraint
是水平约束还是垂直约束?
我能想到的尝试做出这种改变的唯一方法是调用[constraint description];
,然后在结果字符串中搜索"V:"
或"H:"
我想查找此信息的原因是我在prototype
上的UITableViewCell
上设置了两个几乎相同的约束storyboard
,唯一的区别是一个描述与superview
的水平距离,以及其他的垂直。在给定从我的服务器返回的某个参数的情况下,我想删除垂直的、以编程方式添加的约束来描述正在添加的新视图。
任何建议都会非常有帮助!
编辑:
我接受了 graymouser 的回答,因为他的解释是一个绝妙的答案,并且是我最终解决描述的方式,但也想感谢 @kongtomorrow,他也在 graymouser 在这里回答我之前通过 twitter 提出了这个答案!感谢您的帮助!
这是我用来查找约束的实际代码:
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,以合理确定我正在查看正确的约束,然后删除它并成功添加新的约束描述!
【问题讨论】:
【参考方案1】:不是真的。 VFL
映射到底层的 NSLayoutConstraint +:constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:
调用。
但是,如果您检查约束上的 firstAttribute 或 secondAttribute NSLayoutAttribute
属性,您可能能够推断出它是水平的还是垂直的。如果您从VFL
生成约束,它们可能不会非常复杂,因此这可能是一个简单的推论例如,如果您遇到超级视图上的 firstAttribute 设置为 NSLayoutAttributeLeft
而 secondAttribute 是 NSLayoutAttributeLeft
对于子视图,它可能是水平的。但只有可能。
您可能只想坚持解析描述,可能将NSLayoutConstraint
子类化以添加水平/垂直属性,或者为记录 H 或 V 的字典中的每个约束维护辅助数据。
【讨论】:
【参考方案2】:如果您特别需要检查与视图与其容器的距离有关的约束,我认为这是可行的。水平约束的第一个和第二个属性是NSLayoutAttributeLeading
或NSLayoutAttributeTrailing
,垂直约束将具有NSLayoutAttributeTop
或NSLayoutAttributeBottom
。
此外,如果这些约束是使用 IB 设置的,您实际上可以为它们创建出口。
【讨论】:
这个解决方案对我有用,虽然水平的 NSLayoutAttributeCenterX 也应该检查,垂直的 NSLayoutAttributeCenterY 也应该检查。以上是关于如何确定 NSLayoutConstraint 是水平的还是垂直的?的主要内容,如果未能解决你的问题,请参考以下文章
使用 NSLayoutConstraint 在主视图中定位两个 UIButton 元素