如何使用约束使按钮成为 UITableViewCell 宽度的一半(故事板或以编程方式)
How to make a button half the width of a UITableViewCell using constraints (Storyboard or Programatically)
我有一个正在处理的项目需要两个按钮和一些数据,这些数据将占据它们所在的 UITableViewCell 宽度的一半。
过去,当我想这样做时,我通常会设置一个约束条件,即按钮的宽度与其父视图的宽度相等,并给它一个 0.5 的乘数。
出于某种原因,但是在 UITableViewCell 中,我无法让 Storyboards 给我这个选项。 GUI 中的 "Equal Widths" 约束是灰色的。
我决定仅以编程方式执行此操作,因此在自定义单元格中我绑定了以下代码。我尝试将下面的 cellInit()
方法放在 awakeFromNib 中调用,但出现错误。我也尝试过在加载单元格时在 cellForRowAtIndexPath
上调用它,但得到了同样的错误。
导入 UIKit
class 轮询单元: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,然后将按钮放置在视图顶部。这样我就得到了 'equal width' 选项。
在评论中,我们讨论了您利用 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()
。
您可以在下面的 link 中了解更多信息:他们有两个并排按钮的示例:
我有一个正在处理的项目需要两个按钮和一些数据,这些数据将占据它们所在的 UITableViewCell 宽度的一半。
过去,当我想这样做时,我通常会设置一个约束条件,即按钮的宽度与其父视图的宽度相等,并给它一个 0.5 的乘数。
出于某种原因,但是在 UITableViewCell 中,我无法让 Storyboards 给我这个选项。 GUI 中的 "Equal Widths" 约束是灰色的。
我决定仅以编程方式执行此操作,因此在自定义单元格中我绑定了以下代码。我尝试将下面的 cellInit()
方法放在 awakeFromNib 中调用,但出现错误。我也尝试过在加载单元格时在 cellForRowAtIndexPath
上调用它,但得到了同样的错误。
导入 UIKit
class 轮询单元: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,然后将按钮放置在视图顶部。这样我就得到了 'equal width' 选项。
在评论中,我们讨论了您利用 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()
。
您可以在下面的 link 中了解更多信息:他们有两个并排按钮的示例: