ios - 确定 iOS 设备上可用的最大 PHAsset 图像大小

标签 ios photokit phasset icloud-photo-library

如何确定 iOS 设备上可用的最大 PHAsset 图像大小,这里的“可用”是指当前在设备上,不需要从 iCloud 照片库进行任何网络下载?

我一直在开发一个应用程序,其中一组缩略图显示在 UICollectionView 中(很像照片应用程序),然后用户可以选择一个图像来查看它的全尺寸。如有必要,可从 iCloud 下载全尺寸图像。但是,我想向用户展示图像的最大可能版本,直到完整尺寸可用。

Photos Framework 的工作方式很奇怪:

在 Collection View 中,我使用 PHCachingImageManagercache (以及后来的 request )targetSize 为 186x186 像素的图像(由于视网膜缩放,UICollectionViewCell 尺寸加倍)。

效果非常好,滚动速度非常快,并且在用图像填充单元格时没有延迟。检查返回图像的大小,它们大约都是 342x256 像素。那是在我的 iPhone 6 上,启用了 iCloud 照片库和“优化存储”,所以大多数图像只在设备上存储小缩略图。

但是,奇怪的是,如果我随后使用 PHCachingImageManagerPHImageManager.defaultManager() 请求任何图像的完整尺寸(或更大)版本使用 PHImageRequestOptionsDeliveryMode.Opportunistic选项,返回的第一个(低质量)图像是一个很小的 ​​60x45 像素邮票,在全屏上看起来很糟糕,直到最终下载全尺寸图像来替换它。

很明显,设备上已经 了更大的缩略图 (342x256),因为它们刚刚显示在 Collection View 中!那么为什么在完整尺寸下载完成之前它不将它们作为第一个“低质量”图像返回?为了确保 342x256 图像确实已经在设备上,我在飞行模式下运行了代码,因此没有网络访问发生。

我发现,如果我请求最大 256x256 的任何尺寸,我会得到 342x256 的图像返回。一旦我变大(甚至 1 个像素),它就会首先返回 60x45 图像,然后尝试下载全尺寸图像。

我更改了我的代码以首先发出 256x256 请求,然后是带有 PHImageRequestOptionsDeliveryMode.HighQualityFormat 的全尺寸请求(不返回微小的中间图像),并且效果很好。这也是 iOS 照片应用程序必须做的事情,因为它在下载完整图像的同时显示相对高质量的缩略图。

那么,在这种背景下,我如何知道 PHAsset 的设备图像最大尺寸是多少? 256x256 是一个神奇的数字,还是取决于 iCloud 照片图库优化空间的方式(基于图库的大小和可用的设备存储空间)?

Photos Framework 没有返回当前可用的最大图像(当被要求提供比当前更大的尺寸时),这看起来确实像是一个错误,并且要获得它所拥有的最大尺寸,您必须要求该尺寸或更小,因为如果您要求更大,您将获得 60x45 的缩影!奇怪。

更新提交给 Apple 的错误报告:https://openradar.appspot.com/25181601
演示错误的示例项目:https://github.com/mluisbrown/PhotoKitBug

最佳答案

使用问题中发布的示例项目,我能够在模拟器中重现该问题,但是当我进行以下更改时,我只会收到最大的图像:

let targetSize = PHImageManagerMaximumSize

关于ios - 确定 iOS 设备上可用的最大 PHAsset 图像大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32342522/

相关文章:

iphone - 数据源方法在 iOS 4.3 中不调用,但在 iOS 5 及更高版本中工作

ios - 不变违规 : Native component for "RNSVGSvgView" does not exist

ios - iOS 8 神秘崩溃

ios - 有什么方法可以从 iOS 设备控制 USB 摄像头吗?

ios - 在 AVPlayer 中播放慢动作 AVAsset 时出现问题

ios - 使用 Photo Kit 和 Swift 在 UICollectionViewCell 中模糊图像

ios - 未找到 PHImageResultIsDegradedKey/PHImageFileURLKey

ios - 在 UICollectionView 中加载用户相册时内存增长失控

swift - 使用照片框架将带有名称的图像保存到相册

ios - IOS 的 Firebase 存储不从相机胶卷上传 .MOV