我的视图控制器底部有一个包含按钮的滚动条。按钮并不总是活动的,它们随着用户将它们添加到他的收藏夹而改变。这意味着我必须以编程方式决定按钮的x位置。
我所做的是创建从故事板中的视图控制器到脚本的所有按钮的出口,我试图像这样访问它们(简化代码):
var Items = [String : Bool]
@IBOutlet weak var item1: UIButton!
...
if Items[item] == true {
item1.isEnabled = true
\\ here comes a line of code where i should position item1's x position but I haven't managed to find the right way
}
问题是如何以编程方式更改UIButton的x位置,是否有更好的方法来处理问题?我正在使用Xcode 8和swift 3
编辑:
约束方法:
func activeConstraint(element: UIButton, constant: Int) {
let widthConstraint100 = NSLayoutConstraint(item: element,
attribute:NSLayoutAttribute.width,
relatedBy:NSLayoutRelation.equal,
toItem:nil,
attribute:NSLayoutAttribute.notAnAttribute,
multiplier:1.0,
constant: 100)
let widthConstraint0 = NSLayoutConstraint(item: element,
attribute:NSLayoutAttribute.width,
relatedBy:NSLayoutRelation.equal,
toItem:nil,
attribute:NSLayoutAttribute.notAnAttribute,
multiplier:1.0,
constant: 0)
if constant == 0 {
element.removeConstraint(widthConstraint100)
element.addConstraint(widthConstraint0)
} else {
element.removeConstraint(widthConstraint0)
element.addConstraint(widthConstraint100)
}
element.updateConstraints()
}
调用函数的示例:
if Items[item] == true {
activeConstraint(element: item, constant: 100)
} else {
activeConstraint(element: item, constant: 0)
}
编辑2:
虽然我在这里看到很多关于UIStackView(like this one)的问题,但没有一个解决方案适合我。我在屏幕底部有一个水平滚动条,其中许多按钮以编程方式激活或取消激活,其宽度约束设置为0或100.这是我的情况下最终结果(XCode 8.0):
层次结构: image
UIScrollView有一个元素:View(让我们称之为容器视图),它包含滚动条的所有内容。容器视图需要有4个约束 - top,bottom,leading和trailing设置为superView(UIScrollView)。 (最好全部4设置为0)。同时将垂直约束设置为从Container视图水平居中到superView - UIScrollView。
StackView包含所有按钮 - 它需要将所有4个约束(顶部,底部,前导,尾随)设置为superView,即Container View。
所有按钮都需要将其宽度约束设置为所需的常量。