Ios 在自动布局中将视图动态移动到新位置

Ios 在自动布局中将视图动态移动到新位置,ios,swift,autolayout,uilabel,Ios,Swift,Autolayout,Uilabel,我有一个自定义的UITableViewCell布局,如下所示。它有三个标签 标签2是可选的。并不是每个细胞都有。所以我想隐藏它,并将标签1向下移动一点,以便在这种情况下与标签3对齐 以下是我为每个标签添加的约束 标签1 标签2 标签3 请注意,我添加了一个额外的约束,将中心与Y对齐,值为0到标签1,并将其优先级设置为750。我想,如果我删除标签2,优先级较低的约束将取而代之并向下移动 class TableViewController: UITableViewController {

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

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

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

标签1

标签2

标签3

请注意,我添加了一个额外的约束,将中心与Y对齐,值为0到标签1,并将其优先级设置为750。我想,如果我删除标签2,优先级较低的约束将取而代之并向下移动

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先生,我在标签1上添加了一个顶部约束。然后在
cellforrowatinexpath
方法中,我更改了它的值

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
    }

但这也不起作用。

尝试为标签1的顶部约束设置一个出口。移除标签2时,更新标签1的顶部约束,即container.height/2,或移除顶部约束,并为标签1提供中心约束。如果需要,在更新约束条件后进行布局。

我对您的方式印象非常深刻,因为如果我必须完成的话,我会遵循完全相同的步骤:)

现在我的建议是: 删除您添加的不起任何作用的额外“将中心与Y对齐,值为0的标签1:)

我可以看到你已经有了一个对齐中心y与一些偏移我相信-13标签1。为其创建一个iboutlet:)让我们将其名称命名为centerLabel1Constraint:)

每当您要将标签1置于中心位置时,隐藏标签2并将centerLabel1Constraint.constant设置为0并调用[cell LayoutIfNeed]

这应该可以完成任务:)
快乐编码:)

我找到了一种方法,利用
NSLayoutConstraint
的新
active
属性来实现这一点,如本文所述

我对值为-13的对齐中心Y约束进行了
IBOutlet
。从中删除了
关键字

然后在
cellforrowatinexpath
方法中,我只需切换
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
}

试穿一下
需要的布局
?@zcui93刚刚试过。没有变化。我注意到标签1的
CentreY
约束都针对
superview
,第二个约束是否应该与标签2相关?标签放在哪里?在cell contentview中还是在cell自定义uiview中?@Mr.T在cell contentview中。只是尝试一下。但不幸的是,它似乎不起作用。更新了问题。感谢您的回复。我试过这个。它起作用,但只是部分起作用。问题是,对于标签为2的单元格,无法确定常量的值,因为一旦将其设置为0,当单元格被重用时,它就会被重用。您已经知道常量值了吗???我的意思是,当您想要显示label2时,只需使其可见,并将centerLabel1Constraint.constant的值设置回-13,并在摘要中调用[cell LayoutFneed]:indexpath处的行的单元格看起来像是(条件:show label2){centerLabel1Constraint.constant=-13;label2.Hidden=NO;[cell LayoutFneed]}els{{centerLabel1Constraint.constant=0;label2.Hidden=YES;[cell layoutifneed]}不是吗???:)问题是我不喜欢硬编码值-13。因为这些单元格是自动调整大小的。无论如何,我找到了一种方法。我发布了它。谢谢你的帮助。硬编码-13不会有任何区别,伙计:)因为它总是从中心减去y值,而y值是根据o动态计算的n单元格的高度:)因此,无论您的单元格大小如何,它始终显示在垂直中心线上方13个像素:)这就是苹果提供恒定概念的目的:)无论如何,很高兴您找到了解决方案:)我仍然认为这不是最好的解决方案。由于标签具有固有的大小,因此应该有一个只有通过将标签文本设置为零才能实现此目的。我们将在明天检查并给出答案