【问题标题】:iOS 10.3 beta - ImageView in CollectionViewCell bug?iOS 10.3 beta - CollectionViewCell 中的 ImageView 错误?
【发布时间】:2017-08-05 00:22:31
【问题描述】:

是否有其他人在 iOS 10.3 beta 6 的集合视图单元格中显示图像 (UIImageView) 时遇到问题?最初可见的单元格显示图像,但是当我滚动时变得可见的新/出列单元格不显示图像。这是在 Objective C 中,还没有在 Swift 中尝试过。 单元格定义:

@interface StdCollectionViewCell : UICollectionViewCell

@property (strong, nonatomic) IBOutlet UIImageView *fileImage;      // for thumbnail image of file
@property (strong, nonatomic) IBOutlet UITextView *fileTextView;    // for name or description of file
@property (nonatomic) BOOL unviewed;                                // has the user viewed this file yet

@end

cellForItemAtIndexPath,我得到一个UIImage(我已经验证不为空),然后设置单元格的fileImage.image属性:

theCell.fileImage.image = image;                                                                                        // set the thumbnail image

我在分配图像后尝试使用setNeedsDisplay,但这没有帮助。

【问题讨论】:

  • 你能在 CollectionView 的属性检查器中检查你没有预取单元格吗?您会在节页眉和节页脚下方找到此选项。
  • 请显示完整的代码,而不是一行摘录。显示足够的代码以使某人能够重现。
  • @Murloc,感谢您的建议。如果我关闭单元预取,问题就会消失。奇怪的是,这只是在 beta 6 中出现的。不知道为什么预取单元格会阻止图像在单元格变得可见时显示。似乎仍然是一个错误。
  • @matt,感谢您的提醒。我通常会发布更完整的代码,但出现了其他问题,我决定用最少的代码完成帖子,以防有明显的我遗漏的东西。我将尝试开发一个最小的应用程序,该应用程序在启用 Cell Prefetching 时会出现问题,并将该代码添加到此线程中。

标签: ios objective-c uiimageview uicollectionviewcell


【解决方案1】:

在尝试创建一个显示问题的简单应用时,我能够弄清楚为什么没有显示图像。

在预取出现之前(可能在 iOS 9 是最新的,甚至在此之前),我已经创建了代码来将创建/检索图像分派到另一个队列。一旦它们准备就绪,将它们分配给单元格的 UIImageView 对象的代码将被分派回主队列。

如果用户在图像准备好之前将单元格向后滚动到屏幕外,为了不浪费循环,我在继续下一步之前使用indexPathsForVisibleItems 检查了几次以查看单元格是否可见。如果路径不在该数组中,我将只为图像返回 nil。此外,当我准备将图像分配给 UIImageView.image 属性时,我使用了集合视图的cellForItemAtIndexPath

显然,通过预取,这应该不起作用,因为indexPathsForVisibleItems 不应该包含尚不可见的预取单元格,如果单元格不可见,cellForItemAtIndexPath 应该返回 null(因此设置图像的消息将被发送为 null)。

在我最初的调试过程中,我得到了一个图像;但是我没有注意到我试图分配该图像的单元格变量为空!

奇怪的是,到目前为止,这段代码一直在 iOS 10 中运行,这似乎表明预取的单元格包含在可见项数组中,而 cellForItemAtIndexPath 正在为预取但不可见的单元格工作。现在似乎已修复,导致我的代码中断。

编辑:毕竟不是那么奇怪。我刚刚意识到该应用程序的先前版本是使用 Xcode 7 完成的,这意味着它是使用没有预取的 iOS 9 SDK 构建的。因此,即使它在 iOS 10 上运行,它也没有使用预取。当我在 Xcode 8 中打开应用程序时,默认情况下它在集合视图上启用了 Prefetching。这不是我第一次在 Xcode 8 中测试该应用程序,但在使用 Xcode 8 之前,我一定没有尝试过滚动该集合视图。结束编辑。

快速解决方法是关闭集合视图的预取,这就是我所做的,因为这是一个供我们内部使用的企业应用程序,而不是必须进入 App Store 的东西,所以如果它有点慢。

我应该遵循@matt 的建议(过去我什至曾向其他人提供过 :))并尝试首先制作一个简单的完整示例,我可能会在发布我的问题之前弄清楚这一点。但是那天我还有一些其他的事情要发生并且感到不耐烦,所以我还是发布了。我会努力从我的错误中吸取教训:)。

【讨论】:

    【解决方案2】:

    问题来自 iOS 10 中的一项新功能。

    确实,为了改善集合视图中糟糕的滚动体验,Apple 决定解决更流畅的滚动问题。

    如你所见:

    预取是一种在 集合视图将需要显示单元格,从而提供 有机会提前准备单元格的数据源 创建单元格。

    看看这篇文章:

    WWDC 2016

    UICollectionView Prefetching in iOS 10

    【讨论】:

    • 谢谢@Murloc。我知道预取,但我已经测试了我在引入预取之前使用的 iOS 9 中的代码,并且它在 iOS 10 上运行良好。在 iOS 10.2.1 和 iOS 10.3 beta 6 之间的某个时间点,它停止了工作。经过进一步调查,我的代码不应该与预取一起使用,但确实如此,因此在 iOS 10.3 beta 周期中刚刚修复的预取功能中肯定存在错误。
    • @guywithmazda 很高兴听到您找到解决方案 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    相关资源
    最近更新 更多