如何确定NSLayoutConstraint是水平还是垂直?

时间:2014-02-18 01:32:35

标签: ios objective-c uitableview nsautolayout

这看起来应该是一个简单的任务,但是有没有办法以编程方式告诉NSLayoutConstraint是否是水平或垂直约束?

我能想到尝试改变这种差异的唯一方法是致电[constraint description];,然后在结果字符串中搜索"V:""H:"

我想找到这些信息的原因是我在prototype上的UITableViewCell storyboard上设置了两个几乎相同的约束,唯一的区别是一个描述距离的superview水平距离NSArray *constraints = [bubble constraints]; for (NSLayoutConstraint *constraint in constraints) { if ([[constraint firstItem] isEqual:messageLabel] && [[constraint secondItem] isEqual:bubble] && [constraint secondAttribute] == NSLayoutAttributeTop) { [bubble removeConstraint:constraint]; } } ,另一个是纵向。我想删除垂直,以编程方式添加约束来描述在我的服务器返回某个参数的情况下添加的新视图。

任何建议都会非常有用!

编辑:

我接受了greymouser的答案,因为他的解释是一个很棒的答案,也是我最终解决这个问题的方法,但也想赞美@kongtomorrow,在greymouser在这里回答我之前,他也通过twitter建议了这个答案!谢谢你的帮助!

以下是我用来查找约束的实际代码:

{{1}}

以上匹配约束的firstItem,secondItem和secondAttribute,以合理确定我正在查看正确的约束,然后我将其删除并成功添加我的新约束描述!

2 个答案:

答案 0 :(得分:2)

不是真的。 VFL映射到基础NSLayoutConstraint +:constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:来电。

但是,如果检查约束上的firstAttribute或secondAttribute NSLayoutAttribute属性,则可以推断它是水平还是垂直。如果你从VFL生成约束,它们可能不是非常复杂,所以这可能是一个简单的推论。例如,如果你在superview设置为NSLayoutAttributeLeft和secondAttribute时遇到firstAttribute对于子视图,NSLayoutAttributeLeftNSLayoutConstraint,那么可能水平。但只是可能。

您可能只想坚持解析描述,可能继承{{1}}子类以添加水平/垂直属性,或维护记录H或V的字典中每个约束的辅助数据。

答案 1 :(得分:2)

如果您特别要检查与容器的视图距离有关的约束,我认为这是可行的。水平约束的第一和第二属性可以是NSLayoutAttributeLeadingNSLayoutAttributeTrailing,垂直约束会有NSLayoutAttributeTopNSLayoutAttributeBottom

如果使用IB设置这些约束,您实际上可以为它们创建出口。