使用 swift 中的约束以编程方式创建 UIbutton
create UIbutton programmatically with constraints in swift
在此先感谢您的帮助。
我想在每次单击“添加”按钮时创建一个新的自定义 UIButton。
单击添加按钮后,我希望添加按钮滑过并为新按钮腾出空间。我希望每次都发生这种情况,然后在按钮填满视图的水平 space 后创建一个新行
我怎么会这样做?
注:
我完全理解如何以编程方式创建按钮,它是 constraints/way 让按钮动画滑过,以及我不明白的正确间距
非常感谢
图像是我想要的样子的快速概念。顶行是在我添加几个按钮之前,底行有这么多按钮需要新的一行
您可以通过应用以下代码向任何视图添加约束。
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/
为了能够为视图设置动画,您必须设置约束变量的常量属性(当然,值和方向取决于属性),稍后您必须在 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()
}
}
备注:
您需要为以后想要设置动画的每个约束保留一个变量。根据您的布局行为,您还需要一个指向最后一个按钮的变量,以便您可以测量位置。
常量0表示约束的初始状态,当它被添加和创建时,所以基于这个初始状态,视图将从它的初始位置(从左边开始,或者从右边开始,或者其他什么)移动您选择的初始位置)。
我建议您使用 class 构造函数而不是使用视觉语言来创建 NSLayoutConstraint 变量,因为它会生成一个 NSLayoutConstraints 数组,这使得对一个特定约束的约束检测变得更加困难。
最后一点:我建议使用一个 AL 小型库来通过代码更轻松地操纵约束,如您所见,构造 NSLayoutConstraints 可能非常乏味且难以维护。当您使用 Swift 时,请看一下这个项目:https://github.com/robb/Cartography
我一直在我的项目中使用它,它对那些情况真的很有帮助。
我想在每次单击“添加”按钮时创建一个新的自定义 UIButton。
单击添加按钮后,我希望添加按钮滑过并为新按钮腾出空间。我希望每次都发生这种情况,然后在按钮填满视图的水平 space 后创建一个新行
我怎么会这样做?
注:
我完全理解如何以编程方式创建按钮,它是 constraints/way 让按钮动画滑过,以及我不明白的正确间距
非常感谢
图像是我想要的样子的快速概念。顶行是在我添加几个按钮之前,底行有这么多按钮需要新的一行
您可以通过应用以下代码向任何视图添加约束。
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/
为了能够为视图设置动画,您必须设置约束变量的常量属性(当然,值和方向取决于属性),稍后您必须在 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()
}
}
备注:
您需要为以后想要设置动画的每个约束保留一个变量。根据您的布局行为,您还需要一个指向最后一个按钮的变量,以便您可以测量位置。
常量0表示约束的初始状态,当它被添加和创建时,所以基于这个初始状态,视图将从它的初始位置(从左边开始,或者从右边开始,或者其他什么)移动您选择的初始位置)。
我建议您使用 class 构造函数而不是使用视觉语言来创建 NSLayoutConstraint 变量,因为它会生成一个 NSLayoutConstraints 数组,这使得对一个特定约束的约束检测变得更加困难。
最后一点:我建议使用一个 AL 小型库来通过代码更轻松地操纵约束,如您所见,构造 NSLayoutConstraints 可能非常乏味且难以维护。当您使用 Swift 时,请看一下这个项目:https://github.com/robb/Cartography
我一直在我的项目中使用它,它对那些情况真的很有帮助。