是否有其他人在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
,但这没有帮助。
答案 0 :(得分:0)
问题来自iOS 10中的新功能。
事实上,为了改善收藏视图中糟糕的滚动体验,Apple决定解决更顺畅的滚动问题。
如你所见:
预取是一种机制,通过该机制您可以在早期之前收到通知 集合视图将需要显示单元格,从而提供 实际上提前准备单元数据源的机会 创造细胞。
看看这篇文章:
答案 1 :(得分:0)
在尝试创建一个展示问题的简单应用时,我能够找出图像未显示的原因。
在预取之前(可能是iOS 9当前,甚至可能在此之前),我已经创建了代码来分配创建/检索图像到另一个队列。准备好后,将它们分配给单元格的UIImageView
对象的代码将被分派回主队列。
为了不浪费周期,如果用户在图像准备好之前将单元格从屏幕上滚回,我在进行下一步之前检查了几次是否可以使用indexPathsForVisibleItems
查看单元格。如果路径不在该数组中,我将为图像返回nil。此外,当我准备将图像分配给UIImageView.image属性时,我使用了集合视图的cellForItemAtIndexPath
。
显然,通过预取,这应该不起作用,因为indexPathsForVisibleItems
不应包含尚未显示的预取单元格,如果单元格不是cellForItemAtIndexPath
则应该返回null可见(因此设置图像的消息将被发送到null)。
在我最初的调试过程中,我得到了一张图片;但是我没注意到我试图将该图像指定的单元格变量为null!
奇怪的是,到目前为止,这段代码一直在iOS 10中运行,这似乎表明预取的单元格被包含在可见项目数组中,而cellForItemAtIndexPath
正在用于预取但不可见的单元格。现在似乎已经修复,导致我的代码破坏。
快速解决方法是关闭集合视图的预取,这就是我所做的,因为这是一个供我们内部使用的企业应用程序,而不是必须在App Store中运行的东西,因此无关紧要它有点慢。
我应该遵循@ matt的建议(我过去甚至给过其他人:),并尝试先制作一个简单的完整示例,我可能会在发布我的问题之前想出这个。但那天我还有其他一些东西出现并感到不耐烦,所以无论如何我都发布了。我会试着从错误中吸取教训:)。