如何在代码中创建与 @"H:|-10-[view]" 完全相同的 NSLayoutConstraint 对象?

Posted

技术标签:

【中文标题】如何在代码中创建与 @"H:|-10-[view]" 完全相同的 NSLayoutConstraint 对象?【英文标题】:How can I create NSLayoutConstraint object that is exactly same as @"H:|-10-[view]" in code? 【发布时间】:2014-10-06 21:16:12 【问题描述】:

我一直试图弄清楚如何使用NSLayoutConstraint 的constraintWithItem 方法创建一个NSLayoutConstraint 对象,该方法等效于下面的代码。

NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:"@H:|-10-[view]"
                                                               options:0
                                                               metrics:nil
                                                                 views:NSDictionaryOfVariableBindings(view)];

NSLayoutConstraint *rightMarginConstraint = [constraints firstObject];

我尝试过如下代码:

NSLayoutConstraint* rightMarginConstraints = [NSLayoutConstraint constraintWithItem:view
                                                     attribute:NSLayoutAttributeLeading
                                                     relatedBy:NSLayoutRelationEqual
                                                        toItem:superview
                                                     attribute:NSLayoutAttributeLeft
                                                    multiplier:1.0f
                                                      constant:10.0f];

但它做的事情并不完全相同,打印出来时在控制台上也有所不同。我想要一个在控制台上打印为"H:|-10-[view]" 的约束。

有谁知道如何创建一个同时适用于 ios7 和 8 的系统? (我发现iOS 8有新的属性选项,但我仍然支持iOS 7)

提前致谢!

///////// 编辑 ////////

实际上,第二个代码块对简单视图和超级视图产生了完全相同的约束。 但是,我在 TableViewCells 上遇到了问题,结果如下:

这就是我想要的,并使用类似于第一块代码的代码生成

<NSLayoutConstraint:0x7fc050f481c0 H:|-(10)-[UIView:0x7fc050f48070]   (Names:     '|':UITableViewCellContentView:0x7fc050f39310 )>

第二个代码块产生类似于下面输出的约束

<NSLayoutConstraint:0x7b6513d0 view:0x7b64cdf0.leading == UITableViewCellContentView:0x7b64cd10.left>

///编辑 2/// 即使我使用了匹配的属性,我也会得到类似于下面代码的输出。

<NSLayoutConstraint:0x7d695c70 CustomBorderView:0x7d4cb0f0.right == UITableViewCellContentView:0x7d4cb010.right + 10>

///编辑 3///

我认为物品的顺序很重要。我交换了 constraintWithItem: 和 toItem: 的参数,现在输出我想要的。谢谢!

【问题讨论】:

它有什么作用,它在控制台上打印什么? 向我们展示两者的打印日志。 【参考方案1】:

NSLayoutAttributeLeftNSLayoutAttributeLeading 不同。试试这个:

NSLayoutConstraint* rightMarginConstraints = [NSLayoutConstraint
    constraintWithItem:view  attribute:NSLayoutAttributeLeading
    relatedBy:NSLayoutRelationEqual
    toItem:superview attribute:NSLayoutAttributeLeading
     multiplier:1.0f constant:10.0f];

或者这个:

NSLayoutConstraint* rightMarginConstraints = [NSLayoutConstraint
    constraintWithItem:view  attribute:NSLayoutAttributeLeft
    relatedBy:NSLayoutRelationEqual
    toItem:superview attribute:NSLayoutAttributeLeft
     multiplier:1.0f constant:10.0f];

这两个都给了我你想要的输出。混合 ...Left...Leading 会给我你不需要的输出。

【讨论】:

我都试过了,它们给了我相同的结果。对我来说,左应该是绝对的,而领先应该是相对的,但我无法真正区分它们两者的区别。有人可以解释何时以及如何以不同方式使用Leading和Left吗?

以上是关于如何在代码中创建与 @"H:|-10-[view]" 完全相同的 NSLayoutConstraint 对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在EF6 Code First中创建与枚举对应的表?

如何在 MySQL/MariaDB 中创建与 root 具有相同权限的用户? [关闭]

如何在另一个 DataMap 中创建与 ObjEntity 的关系?

如何在熊猫中创建与多列相结合的数据框列

如何在 Mosaic 中创建与任何外部数据库的连接?

如何在 EF7(Core) 中创建与同一个表的多个关系?