使用 UITableViewAutomaticDimension 时 UIImageView 拉伸不正确

Posted

技术标签:

【中文标题】使用 UITableViewAutomaticDimension 时 UIImageView 拉伸不正确【英文标题】:UIImageView stretched incorrectly while using UITableViewAutomaticDimension 【发布时间】:2015-11-17 22:37:42 【问题描述】:

我有一张表,它打开了UITableViewAutomaticDimension 以自动计算每个单元格的高度。自动布局已开启。

表格有自定义单元格。每个单元格都包含一个图像 (UIImageView)

第一次显示表格时,屏幕上可见的图像被垂直拉伸。

其余图像都可以(未拉伸)。 如果我向下滚动(因此第一张图像变得不可见)并向上滚动以再次查看它,那么图像将变得正常(未拉伸)

由于某种原因,ios 似乎无法正确计算第一张图片的高度。

你见过类似的吗?你知道怎么解决吗?

我尝试为 UIImageView 使用不同的模式(Aspect Fit、Aspect Fill)。我可以让它看起来正确。然而,细胞本身仍然被拉伸(比它应该的高得多)。

附:我试图创建一个单独的项目来在干净的环境中复制这个问题,但我找不到导致错误的东西。

【问题讨论】:

【参考方案1】:

这听起来可能是由于 UIImageView 中的原始图像一开始就具有大尺寸,然后 UITableViewAutomaticDimension 变得混乱。您是否尝试过为每一行使用相同的图像或使用适合UIImageView 尺寸的较小图像?

你说

如果我向下滚动(使第一张图像变得不可见)并向上滚动以再次查看它,那么图像将变得正常(未拉伸)

这很可能是因为 tableview 通过UITableViewdequeueReusableCellWithIdentifier 重用了单元格,这意味着每次您希望显示一个单元格时都不会重新创建一个新单元格,而是从已创建的单元格堆栈中获取一个,并且使用那个(主要是为了节省内存)。此外,这可能是由自动布局问题引起的(可能没有设置约束或约束重叠,XCode 试图通过打破一个或多个约束来解决问题)

另外,您从未说明问题是针对Objective-C 还是Swift

【讨论】:

你是对的。根本原因是 UIImageView 比屏幕大。我有一个调整大小的逻辑来确保图片的宽度等于整个屏幕。我使用 cell.bonnds.width 来调整图片的大小,显然它最初比屏幕宽。【参考方案2】:

首先,确保您必须设置附加到单元格 containerView 的所有左、右、下和上约束,以便自动布局能够发挥作用

其次,您必须将estimatedRowHeight 设置为不同于0 的值。如果您不这样做,自动布局将不会计算单元格的高度。

// Something like this should be fine
tableView.estimatedRowHeight = 44.0

【讨论】:

【参考方案3】:

尝试修复您的顶部、底部、领先、尾随约束.. 如果你想修复图像的高度、宽度,那么还要设置高度、宽度约束。

这将解决您的问题。

【讨论】:

以上是关于使用 UITableViewAutomaticDimension 时 UIImageView 拉伸不正确的主要内容,如果未能解决你的问题,请参考以下文章

在 HeightOfRow 中使用自动调整大小

带有嵌入 UICollectionView 的 UITableView 不起作用

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇