【发布时间】:2015-02-25 05:33:39
【问题描述】:
我想设置一个约束,以编程方式为 UIButton 提供固定(恒定)宽度。我知道我可以使用 constraintsWithVisualFormat 来做到这一点,但是我一直在使用 constraintWithItem 来处理代码中的所有约束。为了好奇心/一致性,我想知道是否有任何方法可以使用 constraintWithItem 来做到这一点。
【问题讨论】:
标签: ios objective-c autolayout
我想设置一个约束,以编程方式为 UIButton 提供固定(恒定)宽度。我知道我可以使用 constraintsWithVisualFormat 来做到这一点,但是我一直在使用 constraintWithItem 来处理代码中的所有约束。为了好奇心/一致性,我想知道是否有任何方法可以使用 constraintWithItem 来做到这一点。
【问题讨论】:
标签: ios objective-c autolayout
找到我的解决方案。只需将另一个对象设置为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))
【讨论】:
这是固定宽度按钮的简单代码。
视觉格式:-
[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 的宽度。您可以根据获得所需的约束来更改这些值。
【讨论】:
迅速:
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
【讨论】:
用Layout Anchors怎么样?
myView.widthAnchor.constraintEqualToConstant(29).isActive = true
【讨论】:
.active被.isActive替换了
myView.widthAnchor.constraint(equalToConstant: width).isActive = true
与其寻找明确的高度 (28),不如寻找height 约束……
loginButton.constraints.first(where: { $0.firstAttribute == .height })?.constant = 40
【讨论】: