在与自动调整一起使用的UITableViewCell中,垂直约束中缺少什么使高度尽可能小?

时间:2016-10-14 04:58:20

标签: ios autolayout nslayoutconstraint ios-autolayout

我试图在具有特定单元格布局的UITableView中使用动态高度。考虑以下该布局的说明性表示:

enter image description here

我有水平约束正常工作(两边15px,它们之间15px,宽度相等)但是我在垂直约束下挣扎。以下是此布局的垂直要求:

  1. 绿色和蓝色矩形的垂直内在内容大小基于创建时传递给单元格的外部数据。
  2. 两个矩形在其超视图中垂直居中
  3. 矩形的顶部/底部边缘与超视图上的相应边缘之间始终存在最小15px的空间。换句话说,无论哪个更高,都要求超视图(即单元格)的高度
  4. 为此,到目前为止,我的约束方式是:

    1. 两个矩形的垂直中心约束
    2. 矩形的高度限制等于或小于超视图的高度减去30(即如果矩形的高度为40,则超视图必须至少为70.这在理论上达到与设置相同的效果分开顶部和底部'> = 15'约束,同时少用两个。)
    3. 垂直内容拥抱超级视图设置为' required' (即1000)
    4. 第三点是因为第二点一起只定义了超视图的最小高度(黄色),但不是最大值。从理论上讲,如果它的高度为10,000,它仍然可以满足这些约束条件。

      我的想法是将其内容设置为“必需”'在不违反其他约束条件的情况下,将使superview尽可能短,因此无论何时,绿色矩形或蓝色矩形都将距离边缘15 px,具体取决于较高者。然而,身高仍然似乎已经延伸到了#39;如此处所见......

      enter image description here

        

      注意:内侧视图正确垂直居中,并正确保持与顶部/底部边缘的最小距离。我试图解决的问题是限制超视图的高度尽可能小。

      我似乎没有得到任何含糊不清的约束信息(我在日志中看不到任何内容,但我相信我应该是因为再次< =约束不是'他们自己就足够了,所以我不确定如何使用工具来调试这个,或者找出哪个约束正在推动这个高度。

      那么,有人可以帮忙吗?

      P.S。为了确保它不是单元格外部的东西,比如忘记为UITableView配置自动高度,我删除了两个矩形,并用一个固定到所有四个边缘的简单多线标签替换它们。当我用它运行它时,单元格的大小正如预期的那样缩小。我提出这个问题可以避免提出可能存在问题的答案。

2 个答案:

答案 0 :(得分:0)

阅读您提供的要求我添加了以下限制:

enter image description here

出于演示目的,我使用了一个简单的视图容器而不是单元格。由于内盒将具有从外部导出的内在内容大小,因此我采用了标签来模仿它。

重申一下,增加的限制是:

<强>水平

  1. 容器视图(橙色)具有超视图的前导和尾随约束。
  2. 内部视图具有15个空间的前导约束条件。
  3. 两个标签都有9个点的前导和尾随约束。
  4. 两个内部视图都具有相同的宽度收敛性。
  5. <强>垂直

    1. 容器视图垂直位于中心。
    2. 两个内部视图都应用了垂直中心约束。
    3. 两个内部视图都有顶部和底部约束,其中&gt; = 15条件。
    4. 两个内部标签都有顶部和底部约束及其超级视图。
    5. 我设定了号码。两个标签的行属性为零,以便它们可以在运行时生长。

      在运行时,我更改了其中一个标签和框的文本,容器也相应增长。

      enter image description here

      enter image description here

      刷新单元格高度实现heightForRow方法并提供最新高度。一个典型的代码片段看起来像这样(假设您已经初始化了单元格):

      cell.needsUpdateConstraints()
      cell.updateConstraintsIfNeeded()
      cell.contentView.setNeedsLayout()
      cell.contentView.layoutIfNeeded()
      let height = cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height + 1
      return height
      

      希望这会有所帮助。

答案 1 :(得分:0)

好的,所以我在内容拥抱时朝着正确的方向前进,但处理此问题的正确方法是在黄色视图0和低优先级上指定高度约束。我用100甚至低于默认的250.当我这样做时,求解器试图尽可能接近零,同时仍然尊重其他约束,因此“拥抱”内容。仍然不知道为什么内容拥抱本身不起作用,但这解决了这个问题。