自 xcode 6.3 以来的 NSLayoutconstraint 损坏

Posted

技术标签:

【中文标题】自 xcode 6.3 以来的 NSLayoutconstraint 损坏【英文标题】:NSLayoutconstraint breakage since xcode 6.3 【发布时间】:2015-04-14 08:02:53 【问题描述】:

我正在尝试将以下约束设置为我的浮动视图之一。

    leftConstraint = [NSLayoutConstraint constraintWithItem:detailView 
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:0.0 
constant:VIEW_WIDTH];

视图将水平移动并具有固定宽度。我无法将此视图固定到任何其他视图。我将更改约束中的常量值以将其移动到我的视图上。

当我在 XCode 6.3 中运行上述约束时,出现以下错误。 “乘数为 0 或第二项为零加上第一个属性的位置会导致位置等于常量的非法约束”

我不确定为什么这会造成非法约束。

为了绕过这个问题,我使用了 0.001 乘数,但这并不是在所有情况下都有效。因此,正在寻找更好的解决方法来满足此要求。

【问题讨论】:

【参考方案1】:

这是自动布局使用的公式:

item1.attribute1 = multiplier × item2.attribute2 + constant

因此,如果您将乘数设置为 0 或没有 item2,则属性 1 将为 constant。这不是一个好主意,因为它是关于超级视图的约束,而没有提及超级视图。在大多数情况下,这是代码中的错误的结果。因此,Apple 决定创建这种约束是非法的。

没有第二项的约束对除高度和宽度之外的所有属性都无效。

您实际上应该在视图的父视图中明确添加约束。

你的约束应该是这样的

leftConstraint = [NSLayoutConstraint constraintWithItem:detailView
                    attribute:  NSLayoutAttributeLeft
                    relatedBy:  NSLayoutRelationEqual
                    toItem:     detailView.superview
                    attribute:  NSLayoutAttributeLeft 
                    multiplier: 1 
                    constant:   VIEW_WIDTH];

【讨论】:

【参考方案2】:

如果您想将视图定位到左侧并添加宽度约束,您必须使用两个约束:

CGFloat leftConstraintConstant = 40.0f;
CGFloat VIEW_WIDTH = 200.0f;

NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:detailView attribute:NSLayoutAttributeLeading multiplier:1.0 constant:leftConstraintConstant];
NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:detailView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:VIEW_WIDTH];

[self.view addSubview:detailView];
[self.view addConstraints:@[leftConstraint,widthConstraint]];

要正确定位您的视图,您还应该为 Y 轴位置和高度添加单独的约束。 请注意,我尚未测试此代码,但它应该能让您简要了解需要做什么。

【讨论】:

以上是关于自 xcode 6.3 以来的 NSLayoutconstraint 损坏的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 6.3 错误 - 无法在情节提要中创建 IBOutlet 引用或使用自定义 UIViewController

XCode 6.3 错误:Interface Builder 文件中的未知类

UILabel - iOS 8 Xcode 6.3 中的单行文本占用 2 行

自 Xcode 11.4 以来的状态栏样式问题

自Xcode 10以来,UIImageView setImage在后台线程上崩溃[重复]

自 Xcode 11 以来 UITableViewCellReorderControl 默认颜色错误