ios - 带有 UIImageView 的自定义 UITableViewCell 为最后一个提供了错误的大小

标签 ios objective-c uitableview

我正在努力解决一个“小”问题。我有一个 UITableView,它显示从远程服务器加载的图像。对于这些图像中的每一个,我都有它们的宽度和高度,因此我使用这些值来计算纵横比。

我在显示图像的 ImageView 上有高度限制,所以当我有宽高比时,我会在返回委托(delegate)方法上的单元格之前更改此限制。

为了计算纵横比,我使用 ImageView 的宽度,而这个是使用 IB 上的约束计算的。像这样。

enter image description here

当我将单元格出队时得到的宽度与 IB 的设置相同。所以我的纵横比暂时是错误的,因为没有使用正确的宽度。此外,在更改为代码上设置的高度约束之前,单元格会暂时使用 IB 上设置的高度约束。这是我使用的方法。

- (void)updateConstraint
{
  // get method has been created by me on a NSDictionary extension
  NSNumber *heightNumber = [self.articleItem.data get:kHeightKey];
  NSNumber *widthNumber = [self.articleItem.data get:kWidthKey];
  self.imageAspectRatio = 16/9;

  if (heightNumber != nil && widthNumber != nil) {
    self.imageWidth = widthNumber.floatValue;
    self.imageHeight = heightNumber.floatValue;
    self.imageAspectRatio = self.imageWidth / self.imageHeight;
  }

  self.imageHeightConstraint.constant = self.articleImageView.frame.size.width / self.imageAspectRatio;
}

对于单元格高度,我返回 UITableViewAutomaticDimension

我不知道我是否在正确的地方正确地进行了所有计算(显然不是)。任何人都可以展示怀特方式吗?非常感谢。

最佳答案

相信我,这个问题绝非“小事”。如果有,那么我可能只是一个认为可以编码的白痴。 (哦等等 - maybe I am? 无论如何 :)

我没有给你所有的答案。我所知道的是,我相信,我有你想要的“或多或少”为我工作,所以我会尽力帮助你解决我从官方文档或我的许多时间中收集的想法在 Stack Overflow 本身上搜索答案。

enter image description here

首先,一些假设:

  1. 您知道所有 UITableViewCellUIImageView 的宽度,根据我可以通过查看您发布的图片收集到的信息。它们要么是“全出血”(即你使用屏幕的整个宽度,就像我的屏幕截图中那样),要么你使用一些边距 - 重要的是你知道宽度,而你动态想要改变的是高度.
  2. 你简短地提到了这一点,但再次确认,这并没有什么坏处。 您无需等待获取图像来设置高度限制。相反,当您从 tableView:cellForRowAtIndexPath: 返回时,您已经更新了限制。这一点非常重要,因为 AutoLayout 喜欢在用户看到之前就知道单元格的高度。

现在,我相信您的代码看起来不错。我确定您已经通过调试器查看了它,自己进行了计算,发现您的高度约束值很好,但是您仍然无法按照您的意愿正确显示它。您没有提到您的日志中是否出现 AutoLayout 错误,因此很难准确判断您的问题出在哪里,但我可以为您指出对我有很大帮助的策略:

  1. 当您得知要设置的新 UIImage 的高度时,不要直接更改约束。相反,请调用 setNeedsUpdateConstraints()
  2. 覆盖updateConstraints()并在最后调用super.updateConstraints()This is heavily emphasized in the official Documentation :

Always call the superclasses implementation as the last step of your updateConstraints method’s implementation.

  1. 在调用 super.updateConstraints() 之前,更新新 UIImage 的高度限制。为什么这很重要?除了这是阅读文档时推荐的方法,我相信这样做可以避免著名的 UIView-Encapsulated-Layout-Height AutoLayout 错误,因为系统会添加约束来固定高度UITableViewCell,如果我们不先更新我们的高度约束,AutoLayout 将被迫打破一些约束。

一些额外的注意事项:

  1. 尝试使用 tableView 的 estimatedRowHeight 属性;将其设置为零,看看会发生什么。或者给它一个更准确的值。
  2. 不要使用 heightForRowAtIndexPath() 或相关方法,它们非常慢,而且您会弄乱自己调整大小的单元格。我建议尝试一下,看看使用这些值是否能为您的 AutoLayout 带来一些启示,但对产品的发布没有帮助。
  3. 不要灰心。无论您怎么想,这都是很难的事情

如果您向我们提供更多信息(例如屏幕截图、AutoLayout 错误等),我相信我可以为您提供进一步的帮助

祝你好运!

关于ios - 带有 UIImageView 的自定义 UITableViewCell 为最后一个提供了错误的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45669854/

相关文章:

ios - 低功耗模式下的 UNNotificationAction 处理程序

ios - 在 iOS 中使用 PushPlugin for Cordova 清除单个通知

swift - UITableView didSelectRowAtIndexPath 获取所选部分的实例

ios - UITableView 中的第一部分从来​​没有正确的内容

ios - 在 Xcode 项目中添加 Carthage 的最快方法

ios - 拍照,在相机中选择完整模式或方形模式

ios - 如何添加 View (以及收缩或拉伸(stretch)其他 View )iOS

c# - 如何使用 MonoTouch 绑定(bind) Obj-C#define UMLOG_ERROR @"[UM Error] "

iPhone 表格 View : How to access text field of custom TableViewCell

objective-c - iOS 从 applicationDidFinishLaunching 升级到 didFinishLaunchingWithOptions