UIView与UITableViewCell中的多行标签

时间:2018-05-05 18:52:11

标签: ios swift uitableview uiview xib

我创建了一个带有两个标签和一个按钮的自定义UITableViewCell。 它的表现完美如预期,看起来像这样:

Cell working

后来,我意识到我需要在多个地方使用这个特定的视图,其中一个不在TableView中。因此,我决定删除我的单元格,然后创建自定义UIView - 并创建一个仅包含此自定义视图的空自定义UITableViewCell - 在所有方向上约束为0。

使用完全相同的元素和约束,UIView在TableView中显示为单元格时,结果如下:

view in cell not working

一切都是一样的。 NumberOfLines设置为0,所有约束都相同。

我还观察到一些奇怪的事情,当我将整个手机旋转到风景时,结果就像这样:

landscape

这正是我喜欢在风景中看的样子。 如果我现在将其恢复为肖像,突然看起来像这样:

Cell working 现在它突然看起来就像我想让它看起来像肖像..我只需将其翻转为风景并回到肖像..为什么会这样?...

我玩了一些变量,其中包括preferredMaxLayoutWidth,并发现如果我将此值设置为屏幕大小(减去16 * 2px填充),它会在首次启动时看起来像预期的那样。但是,我不想设置此值。 px中没有神奇的数字是正确的。这一点的全部意义在于使其适合所有屏幕尺寸和方向。每当superview的layoutSubviews或其他东西被调用时,我可能可以重新设置首选宽度,但我认为必须有一个解决方案......?为什么它适用于UITableViewCell而不适用于UIView 内部 a UITableViewCell

我尝试了各种sizeToFit等等,并且找不到任何针对UIView和UITableViewCell中这种特殊差异的问题或答案。

2 个答案:

答案 0 :(得分:1)

这里的问题有点复杂但我会尝试解释它...当视图布局时,它最初独立于其容器,然后在系统需要确定高度时向系统报告其高度在构建单元格之前发生的单元格。一旦单元格存在并且设备被旋转,视图就“实现”它在单元格中并限制自身并适当地报告其高度。

可悲的是,这是表视图系统中的一个问题,源于遗留问题,即在存在约束之前,单元格的最初大小如何。

最简单的解决方案是将标签和按钮直接放回单元格中。另一种选择可能是使外部视图成为表格视图单元格。您可以在表视图之外为其所需的那个点实例化一个表视图单元。另一个选项是实现表视图委托的tableView:heightForRowAtIndexPath:方法并手动确定大小。

答案 1 :(得分:1)

我假设您正在使用以下方法获取表格视图的高度:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

所以,只需将所有视图添加到堆栈中,并将UIStackView顶部,底部,前导和尾随约束设置为xib的UIView

enter image description here