使用自动布局删除视图时重新排列视图

时间:2015-02-11 09:56:51

标签: ios uitableview swift layout autolayout

我有UITableViewCell这样的人。

enter image description here

所有必需的约束都已正确设置,并且当iOS 8中的内容发生更改时,单元格会自行调整大小而不会出现问题。

enter image description here

我必须在某些条件下隐藏标签3 。当发生这种情况时,我需要重新定位标签2 ,按钮更接近这样。

enter image description here

我尝试将标签2中的额外垂直间距约束添加到按钮,并将其关系设置为小于或等于。

enter image description here

cellForRowAtIndexPath方法中,我删除标签3并更新布局。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier(InfoCell.identifier(), forIndexPath: indexPath) as InfoCell

    cell.label3.removeFromSuperview()
    cell.layoutIfNeeded()

    return cell
}

enter image description here

但是你可以看到标签2 之间的间距和按钮仍然存在。

我是否需要设置或更改现有约束的任何设置才能使其正常工作?

2 个答案:

答案 0 :(得分:1)

尝试将“小于或等于”约束设置为普通约束,将其值设置为您希望在按钮和标签2之间保持的距离,并通过将其设置为a来使其不需要优先级低于1000.

通过将其设置为非必需约束,当包含Label 3时,您将不会获得不可满足的约束冲突,并且当您删除Label 3时,“非必需但高优先级”约束将启动。< / p>

答案 1 :(得分:1)

“小于或等于”将无法压缩间距 - 您可能意味着空间“大于或等于”最小可能的间距。如果“小于”它可以降到零。

“大于或等于”也不会起作用:它是混淆和挫折的持续来源,因为“大于或等于”意味着“等于,大于它必须变得更大,但只有它必须。“即使设置了所有其他尺寸,在iOS8自动调整单元中绝对不是这样,自动布局也不需要保持尺寸更接近等于恒定值;更多的是创建一个其他约束可以推到但不低于其他约束的地板。 Auto Layout的想法是“你说'大于',百万大于我满足于百万dur dur 的约束。”

删除视图会删除附加到视图的所有约束。如在另一个答案中所述,如果您添加了一个链接View2和按钮的优先级较低的约束,那么如果存在View3,它将优先突破,但如果View3及其约束被删除则会启动。

但是,由于删除了约束,因此在删除View3并将其作为单元重用过程的一部分放回时,您将遇到问题。你可以

  1. 将View3放回cellForRowAtIndexPathprepareForReuse时,从头开始重新创建约束。
  2. 在删除影响View3的约束(或单元格内容中的所有约束)之前保存影响View3的约束,可能在单元格NSArray属性中,并在重用之前恢复。
  3. 如果要删除view3,请使用不同的reuseIdentifier,并在出列单元格之前进行检查。向nil发送消息不起作用,因此重复[view3 removeFromSuperview]应该没问题。