我有一个项目,我正在研究它需要两个按钮,其中一些数据将占用它们所在的UITableViewCell宽度的一半。
过去当我想要这样做时,我通常会设置一个约束,即按钮的宽度等于其超视图,并给它乘以0.5。
出于某种原因,但是在UITableViewCell中,我无法让故事板给我这个选项。 "等宽" GUI中的约束显示为灰色。
我决定以编程方式执行此操作,因此在自定义单元格中我绑定了以下代码。我已经尝试在awakeFromNib中调用下面的cellInit()
方法并且出错了。我已尝试在加载单元格时在cellForRowAtIndexPath
上调用它,并得到相同的错误。
导入UIKit
类PollCell:UITableViewCell {
@IBOutlet weak var option1: UIButton!
@IBOutlet weak var option2: UIButton!
override func awakeFromNib() {
super.awakeFromNib()
//cellInit() //Commented out because causes error
}
func cellInit(){
option1.addConstraint(NSLayoutConstraint(item: option1, attribute: .Width, relatedBy: .Equal, toItem: self, attribute: .Width, multiplier: 0.5, constant: 0))
}
}
这是我得到的错误:
' NSInternalInconsistencyException',原因:'无法设置视图层次结构的布局,无法用于约束。
我想要达到的目标是非常标准的,所以我认为这不是什么疯狂的事情,而且我可能做错了。无论哪种方式,我都假设有很多像我这样的新人会遇到这种情况。提前谢谢!
答案 0 :(得分:1)
我遇到过类似你之前的问题。我所做的是首先在单元格中放置一个UIView,其顶部,左侧,右侧,底部约束设置为全0,然后将按钮放在视图顶部。这样我得到'等宽'选项。
答案 1 :(得分:1)
在评论中,我们讨论了您利用contentView.frame.maxX
或者,您可以使用AutoLayout:确保setTranslatesAutoresizingMaskIntoConstraints(false)
分配标签(可选)。你只有两个按钮,但有两个以上,我会使用标签,所以你不需要为每个按钮手动输入UIButton
。
addConstraint(NSLayoutConstraint(item: self.viewWithTag(1) as UIButton, attribute: .Right, relatedBy: .Equal, toItem: self, attribute: .CenterX, multiplier: 0.33, constant: 0))
addConstraint(NSLayoutConstraint(item: self.viewWithTag(2) as UIButton, attribute: .Right, relatedBy: .Equal, toItem: self, attribute: .CenterX, multiplier: 0.66, constant: 0))
OR VFL使用词典:
for button in buttonsDictionary.keys {
self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[\(button1)]-[\(button2)]|", options: .allZeros, metrics: nil, views: buttonsDictionary))
}
在TableView中的cellForRowAtIndexPath中调用cell.updateConstraints()
。
您可以在以下链接中了解更多信息:它们有两个并排按钮的示例: