在自动布局

时间:2015-12-22 15:00:56

标签: ios swift autolayout uilabel

我有一个自定义UITableViewCell布局,如下所示。它有三个标签。

enter image description here

标签2 是可选的。它并不存在于每个细胞中。所以我想隐藏它并将标签1 向下移动一点,以便在发生这种情况时与标签3 居中对齐。

enter image description here

以下是我为每个标签添加的约束。

标签1

enter image description here

标签2

enter image description here

标签3

enter image description here

注意我添加了一个额外的约束,将中心对齐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 的位置仍然相同。

enter image description here

我怎样才能完成我追求的目标?

尝试#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
    }

但这也不起作用。

3 个答案:

答案 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
}

enter image description here