iOS 10.3 beta - CollectionViewCell中的ImageView错误?

时间:2017-03-14 15:16:46

标签: ios objective-c uiimageview uicollectionviewcell

是否有其他人在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,但这没有帮助。

2 个答案:

答案 0 :(得分:0)

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

事实上,为了改善收藏视图中糟糕的滚动体验,Apple决定解决更顺畅的滚动问题。

如你所见:

  

预取是一种机制,通过该机制您可以在早期之前收到通知   集合视图将需要显示单元格,从而提供   实际上提前准备单元数据源的机会   创造细胞。

看看这篇文章:

WWDC 2016

UICollectionView Prefetching in iOS 10

答案 1 :(得分:0)

在尝试创建一个展示问题的简单应用时,我能够找出图像未显示的原因。

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

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

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

在我最初的调试过程中,我得到了一张图片;但是我没注意到我试图将该图像指定的单元格变量为null!

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

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

快速解决方法是关闭集合视图的预取,这就是我所做的,因为这是一个供我们内部使用的企业应用程序,而不是必须在App Store中运行的东西,因此无关紧要它有点慢。

我应该遵循@ matt的建议(我过去甚至给过其他人:),并尝试先制作一个简单的完整示例,我可能会在发布我的问题之前想出这个。但那天我还有其他一些东西出现并感到不耐烦,所以无论如何我都发布了。我会试着从错误中吸取教训:)。