使用 AutoLayout 快速更改按钮位置

Posted

技术标签:

【中文标题】使用 AutoLayout 快速更改按钮位置【英文标题】:Swift Change button position with AutoLayout 【发布时间】:2015-01-08 11:48:43 【问题描述】:

我以这种方式以编程方式创建了按钮

func CreateButtonWithIndex(index:Int) 
    let widthButton = 120
    let heightButton = 80
    let line = (index / 3)
    let column = index % 3
    let newButton = UIButton.buttonWithType(UIButtonType.System) as UIButton
    newButton.frame = CGRect(x:line*widthButton+95, y:column*heightButton+15, width:widthButton, height:heightButton)

    self.view.addSubview(newButton)

现在尝试以这种方式为这个按钮放置 NSLayoutConstraint

func CreateButtonWithIndex(index:Int) 

    let widthButton = 120
    let heightButton = 80
    let line = (index / 3)
    let column = index % 3
    let newButton = UIButton.buttonWithType(UIButtonType.System) as UIButton
    newButton.setTranslatesAutoresizingMaskIntoConstraints(false)

    self.view.addSubview(newButton)

    let constraint1 = NSLayoutConstraint(item: newButton, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1, constant: 1)

    let constraint2 = NSLayoutConstraint(item: newButton, attribute: .CenterY, relatedBy: .Equal, toItem: view, attribute: .CenterY, multiplier: 1, constant: 10)

    view.addConstraints([constraint1,constraint2])

但显然我只知道在同一位置创建了各种按钮。 我试过了,例如

   let constraint1 = NSLayoutConstraint(item: newButton, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1, constant: line)

但是不要走!!!

如何使用 NSLayoutConstraint 放置行和列?

【问题讨论】:

“但不要走”不是问题陈述。下次,请尽量具体说明您的问题以及您遇到的问题。 【参考方案1】:

你在正确的轨道上!问题是您的计算在 x 位置上没有给出足够大的差异。你是说:

let constraint1 = NSLayoutConstraint(
    item: newButton, attribute: .CenterX, relatedBy: .Equal, 
    toItem: view, attribute: .CenterX, multiplier: 1, constant: line)

但是line 是什么?

let line = (index / 3)

好吧,如果index 为 0,则为 1,然后为 2,line 每次都会变为 0。如果您希望这些按钮位于不同的位置,则需要更多更大的差异!

(显然,您还应该将 line 声明或强制转换为 CGFloat。)

【讨论】:

但是如果我插入 let constraint1 = NSLayoutConstraint(item: newButton, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1, constant: line) 我有在线出错 它可能会帮助您查看一些执行您正在做的事情的示例代码。看看我书中的这个例子:github.com/mattneub/Programming-ios-Book-Examples/blob/master/… 这里我们制作了 30 个标签,每个标签都位于前一个标签的下方。 找不到会员CenterX 你只需要说CGFloat(line),这很简单,不是这里的问题。试着把注意力集中在真正的问题上。 :) 我已经回答了你提出的问题,我相信我已经回答正确了。

以上是关于使用 AutoLayout 快速更改按钮位置的主要内容,如果未能解决你的问题,请参考以下文章

iOS将autoLayout按钮位置设置为故事板中心的剩余空间

设置 button.frame.origin 不会快速更改 scrollView 中的位置

使用 AutoLayout,当导航栏消失时,如何将 UILabel 保持在同一位置?

Masonry介绍与使用实践:快速上手Autolayout

更改 AutoLayout 约束的连接点?

Masonry介绍与使用实践(快速上手Autolayout)