【问题标题】:NSLayoutconstraint breakage since xcode 6.3自 xcode 6.3 以来的 NSLayoutconstraint 损坏
【发布时间】: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 乘数,但这并不是在所有情况下都有效。因此,正在寻找更好的解决方法来满足此要求。

【问题讨论】:

    标签: ios ios-autolayout


    【解决方案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 轴位置和高度添加单独的约束。 请注意,我尚未测试此代码,但它应该能让您简要了解需要做什么。

      【讨论】:

        猜你喜欢
        • 2018-10-13
        • 2015-04-29
        • 2022-09-23
        • 1970-01-01
        • 2012-06-23
        • 2013-11-26
        • 1970-01-01
        • 1970-01-01
        • 2016-06-26
        相关资源
        最近更新 更多