我有一个UIButton,我设置为从左边8点,从我的视图底部8点。我目前的宽度和高度设置为> = 32点。
但是,我希望按钮在较大的显示器上更大。我设计了如何设置约束以使按钮始终处于相同的宽高比(在我的情况下为方形)并始终为其父视图宽度的10%,但这意味着当设备旋转时按钮变得越来越小随着视野越来越宽,我不想要那样。我希望它是最短边的10%。
在封闭的ViewController代码中很容易获得我想要的宽度:
let buttonWidth = 0.1 * (self.view.bounds.width < self.view.bounds.height ? self.view.bounds.width : self.view.bounds.height)
但是如何正确地将其应用于按钮以及故事板中应该有哪些约束?整个界面当前在故事板中定义。
我是否直接更新边界?约束?多重约束?在约束的情况下,我完全不熟悉如何在代码中处理它们。
答案 0 :(得分:6)
实现你想要的东西,不能仅使用故事板来完成,因为你想选择屏幕的最小边并获得10%。在代码中,您可以轻松地做到这一点。
let buttonWidth = 0.1 * min(self.view.bounds.width, self.view.bounds.height)
self.yourWidthConstraint.constant = buttonWidth
self.view.layoutIfNeeded()
答案 1 :(得分:1)
试试这个:
your_button.frame.size.width = buttonWidth
或者您可以添加/更改约束:
let widthConstraint = NSLayoutConstraint (item: your_button, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: buttonWidth)
your_button.view.addConstraint(widthConstraint)
答案 2 :(得分:1)
我认为你应该探索Apple的尺寸类API。您可以在Interface Builder中为所有特定情况设置按钮的约束,即较小和较大的设备,纵向和横向。
答案 3 :(得分:0)
编辑:如果要在旋转设备时保持相同的widht / height,请忘记故事板中的宽度约束(但保持纵横比为1)。以编程方式创建宽度约束,如下所示:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// Equivalent: Width of self.button equals 0.1 * width of self.view
let widthConstraint = NSLayoutConstraint(item: self.button,
attribute: NSLayoutAttribute.Width,
relatedBy: NSLayoutRelation.Equal,
toItem: nil,
attribute: NSLayoutAttribute.NotAnAttribute,
multiplier: 1.0,
constant: 0.1 * CGRectGetWidth(self.view.bounds))
self.view.addConstraint(widthConstraint)
self.view.layoutIfNeeded()
}
如果创建宽度常量和宽高比约束,它将不会变宽和变窄。
按住Ctrl键并将按钮拖动到内容视图,然后选择“等于宽度”。然后使用乘数= 0.1编辑该约束。因此,您的按钮宽度始终等于设备宽度的10%。
然后创建一个宽高比约束,按钮不会变窄。
答案 4 :(得分:0)
如果你的按钮有约束,你需要以这种方式找到它:
button.superview?.constraints.forEach { constraint in
if constraint.firstItem === button &&
constraint.firstAttribute == .width {
constraint.constant = 20
return
}
}
self.view.layoutIfNeeded()
或者你可以为你的约束创建一个IBOutlet并改变它的常量。