如何确定 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】:

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

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

【讨论】:

这个解决方案对我有用,虽然水平的 NSLayoutAttributeCenterX 也应该检查,垂直的 NSLayoutAttributeCenterY 也应该检查。

以上是关于如何确定 NSLayoutConstraint 是水平的还是垂直的?的主要内容,如果未能解决你的问题,请参考以下文章

NSLayoutConstraint 并确定哪个子视图更宽

使用 NSLayoutConstraint 在主视图中定位两个 UIButton 元素

如何检查 NSLayoutConstraint 是不是动画

如何使用 NSLayoutConstraint 限制 UIButton 的高度

如何创建返回 NSLayoutConstraint 的函数

滚动 UITableView 时如何创建 NSLayoutConstraint