自xcode 6.3以来NSLayoutconstraint破损

我试图将下面的约束设置为我的浮动视图之一 .

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)

3 years ago

这是Autolayout使用的公式:

item1.attribute1 = multiplier × item2.attribute2 + constant

因此,如果将乘数设置为0或没有item2,则attribute1将为 constant . 这不是一个好主意,因为它是代码中的错误的结果 . 所以Apple决定创建这种约束是违法的 .

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

实际上,您应该明确地添加关于视图的超级视图的约束 .

您的约束应该如下所示

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

3 years ago

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

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轴位置和高度添加单独的约束 . 请注意,我没有测试过这段代码,但它应该让您简要了解需要做什么 .