我有一个自定义UITableViewCell
布局,如下所示。它有三个标签。
标签2 是可选的。它并不存在于每个细胞中。所以我想隐藏它并将标签1 向下移动一点,以便在发生这种情况时与标签3 居中对齐。
以下是我为每个标签添加的约束。
标签1
标签2
标签3
注意我添加了一个额外的约束,将中心对齐Y,值为0到标签1 ,并将其优先级设置为750.我想是否删除标签2 < / strong>,具有较低优先级的约束将取代它并向下移动。
class TableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
// MARK: - Table view data source
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 3
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell
if indexPath.row == 1 {
cell.label2.removeFromSuperview()
cell.updateConstraints()
}
return cell
}
}
但它似乎不起作用。 标签2 已删除,但标签1 的位置仍然相同。
我怎样才能完成我追求的目标?
尝试#1
根据下面的T先生answer,我在标签1 中添加了一个顶级约束。然后在cellForRowAtIndexPath
方法中,我改变了它的值。
override func tableView(tableView: UITableView, cellForRowAtIndexPath
indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell
if indexPath.row == 1 {
cell.label2.removeFromSuperview()
cell.topConstraint.constant = cell.bounds.height / 2
cell.layoutIfNeeded()
}
return cell
}
但这也不起作用。
答案 0 :(得分:0)
尝试为标签1的顶部约束设置一个出口。当你删除标签2时,更新label1的顶部约束,即label.height / 2或者删除顶部约束并给出centerY约束标签1.如果需要,在更新约束后进行布局。
答案 1 :(得分:0)
到目前为止,我的印象非常深刻,如果我必须完成它,那将是我所遵循的完全相同的步骤:)
现在我的建议是: 删除一个额外的&#34;将中心对齐到Y,值为0到标签1&#34;您添加的不是用于任何目的:)
我可以看到你已经有一个对齐中心到y有一些偏移我相信-13到标签1.为它创建一个iboutlet :)让它的名字为centerLabel1Constraint:)
每当您想将标签1带到中心隐藏标签2并设置centerLabel1Constraint.constant = 0并调用[cell layoutIfNeeded]
应该做的工作:) 快乐的编码:)
答案 2 :(得分:0)
我找到了一种方法,可以利用answer中描述的active
s的新NSLayoutConstraint
属性来实现此目的。
我使用值-13对齐中心Y约束IBOutlet
。从中删除了weak
关键字。
然后在cellForRowAtIndexPath
方法中,我只是切换active
属性的值。
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell
if indexPath.row % 2 == 0 {
cell.label2.hidden = true
cell.oldConstraint.active = false
} else {
cell.label2.hidden = false
cell.oldConstraint.active = true
}
return cell
}