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

Ios 如何确定NSLayoutConstraint是水平还是垂直?,ios,objective-c,uitableview,autolayout,Ios,Objective C,Uitableview,Autolayout,这似乎应该是一个简单的任务,但是有没有一种方法可以通过编程来判断NSLayoutConstraint是水平约束还是垂直约束 我能想到的唯一尝试改变的方法是调用[constraint description]

这似乎应该是一个简单的任务,但是有没有一种方法可以通过编程来判断
NSLayoutConstraint
是水平约束还是垂直约束

我能想到的唯一尝试改变的方法是调用
[constraint description]“V:”
“H:”

我想找到这些信息的原因是,我在我的<代码>情节提要<代码>上的<代码>原型<代码>UITableViewCell
上设置了两个几乎相同的约束,唯一的区别是一个约束描述了与<代码>superview的水平距离,另一个约束描述了垂直距离。我想删除垂直的、以编程方式添加的约束,以描述在给定从服务器返回的特定参数的情况下添加的新视图

任何建议都会非常有用

编辑: 我接受了greymouser的回答,因为他的解释是一个非常棒的答案,也是我最终解析描述的方式,但我也要感谢@kongtomorrow,他在greymouser回答我之前通过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,以合理肯定地确认我正在查看正确的约束,然后我将其删除并在之后成功添加新的约束描述

不太可能
VFL
映射到基础的
NSLayoutConstraint+:constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:
调用

但是,如果检查约束上的firstAttribute或secondAttribute
NSLayoutAttribute
属性,则可以推断它是水平的还是垂直的。如果您是从
VFL
生成约束,它们可能并不十分复杂,因此这可能是一个简单的推论,例如,如果您在superview上遇到一个设置为
NSLayoutAttributeLeft
的第一个属性,而子视图的第二个属性是
NSLayoutAttributeLeft
,然后它可能是水平的。但只有可能


您可能只想继续解析描述,可能需要将
NSLayoutConstraint
子类化以添加水平/垂直属性,或者在记录H或V的字典中维护每个约束的辅助数据。

如果您特别需要检查与其容器的视图距离有关的约束,我认为这是可行的。水平约束的第一个和第二个属性为
nslayouttributereading
nslayouttributetrailing
,垂直约束的第一个和第二个属性为
nslayouttributetop
nslayouttributebotom


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

此解决方案对我来说很有效,但对于水平,还应检查NSLAYOUTATTributeCenter,而对于垂直,则应检查NSLAYOUTATTributeCenter。