使用swift中的约束以编程方式创建UI按钮

时间:2015-02-12 18:59:42

标签: ios swift uibutton autolayout

enter image description here先谢谢你的帮助。

每次单击“添加”按钮时,我都想创建一个新的自定义UIButton。

点击添加按钮后,我希望添加按钮滑过并为新按钮腾出空间。我希望每次都能发生这种情况,然后在按钮填满视图的水平空间后创建一个新行

我将如何做到这一点?

注意:

我当然明白如何以编程方式创建一个按钮,它是让按钮动画滑动的约束/方式,以及我不理解的正确间距

非常感谢

图像可以快速了解我希望它看起来像什么。顶行是在我添加几个按钮之前,而底行是有这么多按钮需要一个新行

2 个答案:

答案 0 :(得分:3)

为了能够为视图设置动画,您必须设置约束变量的常量属性(当然,值和方向取决于属性),稍后您必须在UIView动画块内调用layoutIfNeeded()

代码示例:

...
let newButton = UIButton()
containerView.addSubview(newButton)
...

// after adding the button

let horizontalSpace = ButtonWidth + horizontalSpace * 2 
let newLeft = lastButtonX + 2 * (buttonWidth + horizontalSpace) + horizontalSpace

let newLeftConstraint = NSLayoutConstraint(item: newButton, attribute: .Left, relatedBy: .Equal, toItem: lastButton, attribute: .Right, multiplier: 0, constant: horizontalInset)

lastButton = newButton

if newLeft + addButtonWidth >= screenWidth {
    containerView.layoutIfNeeded()
    addButtonLeftConstraint.constant = horizontalSpace
    addButtonTopConstraint.constant = buttonRowsNumber * rowHeight + verticalSpace
    UIView.animateWithDuration(animationTime) {
        containerView.layoutIfNeeded()
    }
} else {
    containerView.layoutIfNeeded()
    addButtonLeftConstraint = newLeft
    UIView.animateWithDuration(animationTime) {
        containerView.layoutIfNeeded()
    }
}

注意:

您需要为以后要制作动画的每个约束保留一个var。根据您的布局行为,您还需要一个var到最后一个按钮,这样您就可以对位置进行测量。

常数0代表约束的初始状态,当它被添加和创建时,基于这个初始状态,视图将从它的初始位置移动(从左边开始,或者右边)或者你选择的任何初始地方)。

我建议您使用类构造函数而不是使用可视语言创建NSLayoutConstraint变量,因为它会生成一个NSLayoutConstraints数组,这使得对一个特定约束的约束检测更加困难。

最后一点:我建议一个AL小型库通过代码更容易地操纵约束,正如您所看到的,构建NSLayoutConstraints可能非常枯燥且难以维护。在您使用Swift时,请查看此项目:https://github.com/robb/Cartography

我一直在我的项目中使用它,它对这些情况非常有帮助。

答案 1 :(得分:2)

您可以通过应用以下代码为任何视图添加约束。

self.view.addConstraints(
  NSLayoutConstraint.constraintsWithVisualFormat(
  "H:|-[myLabel]-|", options: nil, metrics: nil, views: viewsDict))

self.view.addConstraints(
  NSLayoutConstraint.constraintsWithVisualFormat(
  "H:|-[myButton]-|",
  options: nil, metrics: nil, views: viewsDict)) 

self.view.addConstraints(
  NSLayoutConstraint.constraintsWithVisualFormat(
  "V:|-[myLabel]-[myButton]-|", options: nil, metrics: nil, 
  views: viewsDict))

您可以从以下网站获得一个很好的教程:http://makeapppie.com/2014/07/26/the-swift-swift-tutorial-how-to-use-uiviews-with-auto-layout-programmatically/