ios - 如何判断 NSLayoutConstraint 是水平的还是垂直的?

标签 ios objective-c uitableview autolayout

这看起来应该是一个简单的任务,但是有没有办法以编程方式告诉 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/

相关文章:

ios - 当 APNS token 失效时,是否必须重复剩余的推送通知?

iphone - 应用程序在后台时获取屏幕截图? (允许私有(private) API)

iphone - 有什么办法可以增加UITableViewCell中detailTextLabel的宽度?

ios - UITableViewCell 标签显示有小的向上滑动动画

ios - 如何以编程方式快速向 UITableViewCell 内的 UIStackView 添加约束?

ios - onFormat string For NSPredicate

ipad - iPad 上的 3D 轮播效果

ios - 如何在运行时获得 Storyboard中创建的 UIView 的正确大小

iphone - iPad 应用程序中的自定义 map

objective-c - 除了语法之外,还有什么理由通过类方法实例化对象吗?