自Xcode 6.3以来的NSLayoutConstraint损坏问题

3

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

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

视图将水平移动并具有固定宽度。我无法将此视图固定到任何其他视图上。我将更改约束中的常量值以将其移动到我的视图上方。
当我在XCode 6.3中运行上述约束时,会出现以下错误。 “乘数为0或空第二项,加上第一属性的位置,会创建一个非法的约束,其位置等于一个常量”
我不确定为什么这会创建非法约束。
为了绕过此问题,我使用了0.001的乘数,但这在所有情况下都不能正常工作。因此,寻找更好的解决方法来解决此问题。
2个回答

4
Autolayout使用的公式如下:
item1.attribute1 = multiplier × item2.attribute2 + constant

如果将乘数设置为0或没有item2,则attribute1将是constant。这不是一个好主意,因为它涉及到超级视图的约束而没有提及超级视图。在大多数情况下,这是代码中的错误结果。所以苹果公司决定不允许创建这种类型的约束。

除了高度和宽度外,没有第二个项目的约束对所有属性都是无效的。

您应该明确地添加相对于视图的超级视图的约束。

您的约束应该像这样:

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

0

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

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轴位置和高度。 请注意,我尚未测试此代码,但它应该让您大致了解需要完成的工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接