Ios 如何使用约束(故事板或编程)使按钮的宽度为UITableViewCell的一半

Ios 如何使用约束(故事板或编程)使按钮的宽度为UITableViewCell的一半,ios,uitableview,swift,autolayout,Ios,Uitableview,Swift,Autolayout,我有一个项目,我正在工作,需要两个按钮与一些数据,将采取正好一半的宽度UITableViewCell,他们在其中 在过去,当我想这样做时,我通常会设置一个约束,即按钮的宽度与superview相等,并给它一个0.5的乘数 然而,由于某些原因,在UITableViewCell中,我无法让故事板为我提供此选项。GUI中的“等宽度”约束将灰显 我决定以编程的方式来做,所以在自定义单元格中,我绑定了以下代码。我试着将cellInit()方法放在下面的awakeFromNib中调用,结果出现了一个错误。

我有一个项目,我正在工作,需要两个按钮与一些数据,将采取正好一半的宽度UITableViewCell,他们在其中

在过去,当我想这样做时,我通常会设置一个约束,即按钮的宽度与superview相等,并给它一个0.5的乘数

然而,由于某些原因,在UITableViewCell中,我无法让故事板为我提供此选项。GUI中的“等宽度”约束将灰显

我决定以编程的方式来做,所以在自定义单元格中,我绑定了以下代码。我试着将
cellInit()
方法放在下面的awakeFromNib中调用,结果出现了一个错误。加载单元格时,我也尝试在
cellforrowatinexpath
上调用它,但得到了相同的错误

导入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”,原因:“无法在视图层次结构未准备好约束的情况下设置布局。”


我试图达到的是相当标准的,所以我认为这并不是什么疯狂的事情,我可能做了一些错误的事情。不管怎样,我想很多像我这样的新人都会遇到这种情况。提前谢谢

我以前也遇到过类似的问题。我所做的是首先在单元格中放置一个UIView,并将其顶部、左侧、右侧和底部约束设置为全部0,然后将按钮放置在视图顶部。这样我就得到了“等宽”选项。

在评论中,我们讨论了如何利用
contentView.frame.maxX

或者,您可以使用AutoLayout:确保
设置TranslatesAutoResizengMaskintoConstraints(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))
或VFL使用字典:

for button in buttonsDictionary.keys {
          self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[\(button1)]-[\(button2)]|", options: .allZeros, metrics: nil, views: buttonsDictionary))
        }
在TableView中的cellForRowAtIndexPath中调用cell.updateConstraints()

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


除了下面的答案之外,我们还建议创建一个
UITableViewCell
子类,用于设置所需的约束和按钮。如果你想进一步定制这个单元格,它最终可能会有所帮助。我认为你应该后退几步,试着用更小的步骤来思考。在匆忙假设您需要约束之前,您应该将此问题分解为多个步骤。首先,您需要实现一个自定义单元类。然后,您需要在tableview中注册此单元格,并在CellForRowatineXpath中实例化它。然后您应该尝试创建一个按钮。之后,你应该在这个按钮的框架上尝试移动它。暗示。该单元格有一个名为contentView的框架。您可以动态链接到该按钮。button1 width=(cell.contentView.frame.width/2-0)很抱歉没有包含代码,但上面是从我的UITableViewCell子类中提取的,我在UITableViewController子类中设置了UITableViewDelegate和DataSource,并且该单元格正在那里实例化和注册,所以之前已经完成了所有这些。至于使用框架和获取contentView的宽度,我考虑过使用它。这是苹果公司使用相框的方式吗?我很乐意这样做,但我想更好地学习自动布局和约束,也许我被误导了,应该避免约束。@ericgu,为了好玩,我用框架和约束两种方式实现了它。在您的答案中有一点值得注意,contentView.frame.width的宽度为0,因此我不得不使用UIScreen.mainScreen().bounds.width。我确实喜欢手动使用框架,因为这样我就可以完全控制所发生的事情,但我仍然想知道,如果有这样的方法,哪种方法是“正确的”。我道歉。我正在匆忙地为你写伪代码。您应该使用contentView.frame.maxX/2来获取X轴上contentView的中点。好主意,有人知道为什么通过UITableViewCell无法使用此选项吗?只需将他在此处所说的代码输入即可。在执行此操作时,请确保添加像他所说的左、上、右、下到0的约束,否则视图的大小将错误,并且宽度约束也不会有帮助。它确实可以工作,尽管我很沮丧,我添加了一个视图只是为了访问相等的宽度约束。出于某种原因,maxX也返回了0的大小,出于某种原因,您子类化的这个CustomCell的注册可能有问题吗?今天我遇到了一个非常类似的问题,这一行对我来说很有用:label.frame=CGRectMake((contentView.frame.width-profileImageView.frame.maxX)/3,contentView.frame.height/2,50,50)。可能是我使用的是故事板中的单元格,其中有一个id,而不是注册表类的Xib文件。我没有使用IB或Xib。祝你好运。你似乎在很短的时间内取得了进步