【问题标题】:iOS NSLayoutConstraint Fixed Width using constraintWithItemiOS NSLayoutConstraint 使用 constraintWithItem 固定宽度
【发布时间】:2015-02-25 05:33:39
【问题描述】:

我想设置一个约束,以编程方式为 UIButton 提供固定(恒定)宽度。我知道我可以使用 constraintsWithVisualFormat 来做到这一点,但是我一直在使用 constraintWithItem 来处理代码中的所有约束。为了好奇心/一致性,我想知道是否有任何方法可以使用 constraintWithItem 来做到这一点。

【问题讨论】:

    标签: ios objective-c autolayout


    【解决方案1】:

    找到我的解决方案。只需将另一个对象设置为nil,将另一个属性设置为NSLayoutAttributeNotAnAttribute(这是我没有想到的)并使用固定宽度的常量参数:

    [self addConstraint:[NSLayoutConstraint constraintWithItem:myButton
          attribute:NSLayoutAttributeWidth 
          relatedBy:NSLayoutRelationEqual 
          toItem:nil 
          attribute:NSLayoutAttributeNotAnAttribute 
          multiplier:1.0 
          constant:200]];
    

    编辑:由于这个答案似乎仍然得到了相当多的意见,我想我会添加 Swift 语法:

    self.addConstraint(NSLayoutConstraint(
            item: myButton,
            attribute: .width,
            relatedBy: .equal,
            toItem: nil,
            attribute: .notAnAttribute,
            multiplier: 1.0,
            constant: 200))
    

    【讨论】:

    • 别对自己太苛刻了。这些东西很容易错过。
    • 您也可以使用 NSLayoutConstraint.activateConstraints([...]),“通常,使用这种方法比单独激活每个约束更有效。”来自 Apple 文档
    【解决方案2】:

    这是固定宽度按钮的简单代码。

    视觉格式:-

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:     [myButton(==50)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(myButton)]];
    

    将此代码用于使用视觉格式的约束,其中 self.view 是按钮的超级视图,myButton 是按钮的名称,50 是 myButton 的宽度。您可以根据获得所需的约束来更改这些值。

    constraintWithItem 格式:-

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:myButton attribute: NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute: NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:50.0]];
    

    将此代码用于使用 constraintWithItem 格式的约束,其中 self.view 是按钮的超级视图,myButton 是按钮的名称,50 是 myButton 的宽度。您可以根据获得所需的约束来更改这些值。

    【讨论】:

      【解决方案3】:

      迅速:

      let width = 120
      let constraint = NSLayoutConstraint(
          item: myView,
          attribute: .width,
          relatedBy: .equal,
          toItem: nil,
          attribute: .notAnAttribute,
          multiplier: 1.0,
          constant: width)
      NSLayoutConstraint.activateConstraints([constraint])
      

      然后你可以改变约束的常量值

      constraint.constant = width * 2
      

      【讨论】:

        【解决方案4】:

        Layout Anchors怎么样?

        myView.widthAnchor.constraintEqualToConstant(29).isActive = true
        

        【讨论】:

        • 刚刚添加,现在.active.isActive替换了
        • 斯威夫特 5:myView.widthAnchor.constraint(equalToConstant: width).isActive = true
        • 非常感谢您的回答,在花费了更多时间之后,这个解决方案终于奏效了。!干杯。
        【解决方案5】:

        与其寻找明确的高度 (28),不如寻找height 约束……

        loginButton.constraints.first(where: { $0.firstAttribute == .height })?.constant = 40
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-12
          • 1970-01-01
          • 1970-01-01
          • 2012-08-22
          相关资源
          最近更新 更多