如何使用约束(故事板或以编程方式)创建UITableViewCell宽度的一半的按钮

时间:2015-02-22 04:33:28

标签: ios uitableview swift autolayout

我有一个项目,我正在研究它需要两个按钮,其中一些数据将占用它们所在的UITableViewCell宽度的一半。

过去当我想要这样做时,我通常会设置一个约束,即按钮的宽度等于其超视图,并给它乘以0.5。

出于某种原因,但是在UITableViewCell中,我无法让故事板给我这个选项。 "等宽" GUI中的约束显示为灰色。

Example of what I'm trying to achieve

我决定以编程方式执行此操作,因此在自定义单元格中我绑定了以下代码。我已经尝试在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',原因:'无法设置视图层次结构的布局,无法用于约束。

我想要达到的目标是非常标准的,所以我认为这不是什么疯狂的事情,而且我可能做错了。无论哪种方式,我都假设有很多像我这样的新人会遇到这种情况。提前谢谢!

2 个答案:

答案 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()

您可以在以下链接中了解更多信息:它们有两个并排按钮的示例:

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutinCode/AutoLayoutinCode.html#//apple_ref/doc/uid/TP40010853-CH11-SW1