【问题标题】:Rearranging views when a view is removed using auto layout使用自动布局删除视图时重新排列视图
【发布时间】:2015-04-11 15:27:59
【问题描述】:

我有一个这样的UITableViewCell

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

我必须在某些情况下隐藏 标签 3。发生这种情况时,我需要像这样重新定位 label 2 并将按钮靠近。

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

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
}

但是您可以看到 label 2 和按钮之间的间距仍然存在。

我还需要设置或更改现有约束的任何设置以使其正常工作吗?

【问题讨论】:

  • 嘿,如果答案不清楚或没有解决您的问题,您能否发表评论,或者将其标记为已接受?谢谢。

标签: ios uitableview swift layout autolayout


【解决方案1】:

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

通过将其设置为非必需约束,当包含标签 3 时,您将不会遇到不可满足的约束冲突,并且当您删除标签 3 时,“非必需但高优先级”约束将生效。

【讨论】:

  • 感谢您的回复。它有效,但我有一个新问题。我将约束重新设置为 equal 并将其优先级更改为 749。我还将常量设置为 10。当我运行应用程序时,按钮会增加其高度以填充丢失的空间,例如 this。所以我为按钮添加了一个高度约束以保持它固定,然后在 label1 和 label2 之间有一个空格,如this
【解决方案2】:

“小于或等于”不会压缩间距——您可能意味着该空间“大于或等于”可能的最小间距。如果“小于”它可能会下降到零。

“大于或等于”也不起作用:它总是令人困惑和沮丧,因为“大于或等于”意味着“等于,并且大于如果它必须变得更大,但前提是必须这样做。”即使设置了所有其他尺寸,这在 iOS8 自调整单元格中绝对不是这种情况,自动布局也不需要保持尺寸接近等于常数值;更重要的是创建一个其他约束可以推到上面但不能推到下面的地板。 Auto Layout 的想法是“你说 '大于' 并且一百万大于所以我用一百万 dur dur 满足了约束。”

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多