如何以编程方式调整已经存在约束的UIButton的大小?

时间:2015-10-25 09:01:22

标签: ios swift uibutton autolayout

我有一个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)

但是如何正确地将其应用于按钮以及故事板中应该有哪些约束?整个界面当前在故事板中定义。

我是否直接更新边界?约束?多重约束?在约束的情况下,我完全不熟悉如何在代码中处理它们。

5 个答案:

答案 0 :(得分:6)

实现你想要的东西,不能仅使用故事板来完成,因为你想选择屏幕的最小边并获得10%。在代码中,您可以轻松地做到这一点。

  1. 首先,您需要制作宽度约束的IBOutlet。 See this answer for detailed explanation
  2. 然后根据您计算的尺寸更改IBOutlet宽度约束的常量。只要你有1:1的宽高比,它就会自动改变高度等于宽度。

  3. 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中为所有特定情况设置按钮的约束,即较小和较大的设备,纵向和横向。

此处有更多详情:About Designing for Multiple Size Classes

答案 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()
}

如果创建宽度常量和宽高比约束,它将不会变宽和变窄。

Button constraints

按住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并改变它的常量。