如何确定iOS设备上可用的最大 PHAsset
图像大小,其中"available"我的意思是当前在设备上,不需要从iCloud Photo Library下载任何网络?
我一直在开发一个应用程序,其中缩略图的集合显示在 UICollectionView
(很像照片应用程序),然后用户可以选择图像以查看它的完整大小 . 如有必要,可从iCloud下载完整大小的图像 . 但是,我希望向用户显示图像的最大版本,直到完整大小可用 .
Photos Framework的工作方式相当奇怪:
在集合视图中,我正在使用 PHCachingImageManager
(以及后来的request)图像,其中_1354186_为186x186像素(由于视网膜缩放,因此尺寸为 UICollectionViewCell
的两倍) .
这非常有效,滚动非常快,并且在用图像填充单元格时没有延迟 . 检查返回图像的大小,它们大约是342x256像素 . 这是在我的iPhone 6上启用了iCloud Photo Library并启用了“优化存储”,因此大多数图像只能在设备上存储小的缩略图 .
然而,奇怪的是,如果我然后使用PHImageRequestOptionsDeliveryMode.Opportunistic选项使用 PHCachingImageManager
或 PHImageManager.defaultManager()
请求任何图像的完整大小(或更大)版本,则返回的第一个(低质量)图像是一个小的60x45像素邮资在全屏幕上看起来很糟糕的邮票,直到最终下载完整尺寸的图像来替换它 .
显然,设备上已有更大的缩略图(342x256),因为它们只是在集合视图中显示!那么为什么在下载完整尺寸之前,地狱还没有低质量的图像?为了确保342x256图像确实已经在设备上,我在飞行模式下运行代码,因此没有发生网络访问 .
我发现如果我要求任何大小高达256x256我会得到342x256图像返回 . 一旦我变大(甚至1个像素),它将首先返回60x45图像然后尝试下载全尺寸图像 .
我已经更改了我的代码以首先发出256x256请求,然后是 PHImageRequestOptionsDeliveryMode.HighQualityFormat
的完整大小请求(这也是iOS照片应用程序必须执行的操作,因为它在下载完整图像时显示相对高质量的缩略图 .
那么,在这样的背景下,我怎么知道 PHAsset
的设备图像尺寸最大? 256x256是一个神奇的数字,还是取决于iCloud Photo Library如何优化空间(基于库的大小和可用的设备存储)?
当然,似乎是一个错误,照片框架没有返回当前可用的最大图像(当要求的尺寸大于目前的尺寸),并且要获得它拥有的最大尺寸,你必须要求这个尺寸或更小,因为如果你要求更大,你将获得60x45的缩影!离奇 .
UPDATE: 提交给Apple的错误报告:https://openradar.appspot.com/25181601
演示该错误的示例项目:https://github.com/mluisbrown/PhotoKitBug
3 回答
使用问题中发布的示例项目,我能够在模拟器中重现该问题,但是当我进行以下更改时,我只会收到最大的图像:
实际上我不知道苹果会用PHImageResultIsDegradedKey = 1返回降级的45 * 60图像的原因 . 对我来说,我只是首先使用deliveryMode PHImageRequestOptionsDeliveryModeHighQualityFormat请求256 * 256图像,然后我使用其他PHImageRequestOptions来请求完整大小的图像,如下所示:
我认为,Instagram可能会使用这种类似的解决方案来处理来自iCloud的图像 .