iOS 10.3 beta - CollectionViewCell 中的 ImageView 错误?
iOS 10.3 beta - ImageView in CollectionViewCell bug?
是否有人在 iOS 10.3 beta 6 的集合视图单元格中显示图像 (UIImageView) 时遇到问题?最初可见的单元格显示图像,但 new/dequeued 在我滚动时变得可见的单元格不显示图像。这是在 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
,但这没有帮助。
问题来自 iOS 10.
中的一项新功能
确实,为了改善集合视图中糟糕的滚动体验,Apple 决定解决更流畅的滚动问题。
如你所见:
Prefetching is a mechanism by which you are notified early before the
collection view will need the cells to be displayed, thus providing an
opportunity to prepare the cell's data source in advance of actually
creating the cell.
看看这篇文章:
在尝试创建一个出现问题的简单应用程序时,我弄清楚了为什么无法显示图像。
在预取出现之前(可能是在 iOS 9 出现时,甚至可能在此之前),我已经创建了将图像分派 creating/retrieving 到另一个队列的代码。一旦它们准备就绪,将它们分配给单元格的 UIImageView
对象的代码就会被分派回主队列。
如果用户在图像准备好之前将单元格从屏幕上滚动回来,为了不浪费周期,我在继续下一步之前使用 indexPathsForVisibleItems
检查了几次以查看单元格是否可见.如果路径不在该数组中,我只会 return nil 用于图像。此外,当我准备将图像分配给 UIImageView.image 属性 时,我使用了集合视图的 cellForItemAtIndexPath
.
显然,对于预取,这不应该起作用,因为 indexPathsForVisibleItems
不应该包含还不可见的预取单元格,并且 cellForItemAtIndexPath
应该 return null如果单元格不可见(因此设置图像的消息将被发送到 null)。
在我最初的调试过程中,我得到了一张图片;但是我没有注意到我试图将该图像分配给的单元格变量为空!
奇怪的是,到目前为止,这段代码一直在 iOS 10 中运行,这似乎表明预取单元格已包含在可见项数组中,并且 cellForItemAtIndexPath
正在为预取工作,但不可见的细胞。现在似乎已经修复,这导致我的代码中断。
编辑:毕竟没那么奇怪。我刚刚意识到应用程序的先前版本是使用 Xcode 7 完成的,这意味着它是使用 iOS 9 SDK 构建的,没有预取。所以即使它在 iOS 10 上是 运行,它也没有使用预取。当我在 Xcode 8 中打开应用程序时,它默认在集合视图上启用预取。这不是我第一次在 Xcode 8 中测试该应用程序,但在使用 Xcode 8 之前我一定没有尝试滚动该集合视图。结束编辑。
快速修复是关闭集合视图的预取,这是我所做的,因为这是供我们自己内部使用的企业应用程序,而不是必须进入 App Store 的东西,所以它不需要慢一点也没关系。
我应该听从@matt 的建议(我过去甚至给过其他人 :) )并尝试首先制作一个简单的完整示例,我可能会在发布我的问题之前弄清楚这一点。但是那天我还有一些其他的事情要处理,感到不耐烦,所以我还是发了帖。我会努力从我的错误中吸取教训:).
是否有人在 iOS 10.3 beta 6 的集合视图单元格中显示图像 (UIImageView) 时遇到问题?最初可见的单元格显示图像,但 new/dequeued 在我滚动时变得可见的单元格不显示图像。这是在 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
,但这没有帮助。
问题来自 iOS 10.
中的一项新功能确实,为了改善集合视图中糟糕的滚动体验,Apple 决定解决更流畅的滚动问题。
如你所见:
Prefetching is a mechanism by which you are notified early before the collection view will need the cells to be displayed, thus providing an opportunity to prepare the cell's data source in advance of actually creating the cell.
看看这篇文章:
在尝试创建一个出现问题的简单应用程序时,我弄清楚了为什么无法显示图像。
在预取出现之前(可能是在 iOS 9 出现时,甚至可能在此之前),我已经创建了将图像分派 creating/retrieving 到另一个队列的代码。一旦它们准备就绪,将它们分配给单元格的 UIImageView
对象的代码就会被分派回主队列。
如果用户在图像准备好之前将单元格从屏幕上滚动回来,为了不浪费周期,我在继续下一步之前使用 indexPathsForVisibleItems
检查了几次以查看单元格是否可见.如果路径不在该数组中,我只会 return nil 用于图像。此外,当我准备将图像分配给 UIImageView.image 属性 时,我使用了集合视图的 cellForItemAtIndexPath
.
显然,对于预取,这不应该起作用,因为 indexPathsForVisibleItems
不应该包含还不可见的预取单元格,并且 cellForItemAtIndexPath
应该 return null如果单元格不可见(因此设置图像的消息将被发送到 null)。
在我最初的调试过程中,我得到了一张图片;但是我没有注意到我试图将该图像分配给的单元格变量为空!
奇怪的是,到目前为止,这段代码一直在 iOS 10 中运行,这似乎表明预取单元格已包含在可见项数组中,并且 cellForItemAtIndexPath
正在为预取工作,但不可见的细胞。现在似乎已经修复,这导致我的代码中断。
编辑:毕竟没那么奇怪。我刚刚意识到应用程序的先前版本是使用 Xcode 7 完成的,这意味着它是使用 iOS 9 SDK 构建的,没有预取。所以即使它在 iOS 10 上是 运行,它也没有使用预取。当我在 Xcode 8 中打开应用程序时,它默认在集合视图上启用预取。这不是我第一次在 Xcode 8 中测试该应用程序,但在使用 Xcode 8 之前我一定没有尝试滚动该集合视图。结束编辑。
快速修复是关闭集合视图的预取,这是我所做的,因为这是供我们自己内部使用的企业应用程序,而不是必须进入 App Store 的东西,所以它不需要慢一点也没关系。
我应该听从@matt 的建议(我过去甚至给过其他人 :) )并尝试首先制作一个简单的完整示例,我可能会在发布我的问题之前弄清楚这一点。但是那天我还有一些其他的事情要处理,感到不耐烦,所以我还是发了帖。我会努力从我的错误中吸取教训:).