语境
我使用Photos framework显示在我工作的iOS应用程序的用户的图片。在iOS 8.3版本,请求在错误的图像图像PHImageManager结果
作为参考,我上传了几张图片给imgur,在这里你可以找到我正在测试的原始图片,以及我用UIImageView制作的带有粉红色背景的屏幕截图,用“Aspect Fit”配置显示获取的图像。这里的链接:http://imgur.com/a/VPJ9J
我使用两种测试方案:第一,风景图像,其imageOrientation
是UIImageOrientation.Up
(0);其次,一个肖像图像,与UIImageOrientation.Right
(3)。你可以检查文档(我会把链接放在这里,但我没有足够的声望,对不起)。
在iPhone 4S(8.1.2的iOS)显示在粉红色的UIImageView内部横向版式风景图像,并与纵向版式的画像,按预期方式。但iPhone 5和6 Plus(均为iOS 8.3)均以横向布局显示两个图像。
代码
这是我使用请求图像的代码:
var targetSize = CGSizeMake(1000, (CGFloat(asset.pixelHeight)/CGFloat(asset.pixelWidth)) * 1000)
var options = PHImageRequestOptions()
options.version = PHImageRequestOptionsVersion.Current
options.deliveryMode = PHImageRequestOptionsDeliveryMode.HighQualityFormat
options.resizeMode = PHImageRequestOptionsResizeMode.Exact
options.networkAccessAllowed = true
PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: targetSize, contentMode: PHImageContentMode.AspectFill, options: options) { (result: UIImage!, info) -> Void in
if !info[PHImageResultIsDegradedKey]!.boolValue {
println("asset.pixelWidth: \(asset.pixelWidth)")
println("asset.pixelHeight: \(asset.pixelHeight)")
println("targetSize: \(targetSize)")
println("result.size: \(result.size)")
println("result.imageOrientation: \(result.imageOrientation.rawValue)")
completion(result)
}
}
测试
这里是执行与这两个图像测试时,我得到的日志:
案例1:iPhone 4S(8.1.2)
横向:
asset.pixelWidth: 3264
asset.pixelHeight: 2448
targetSize: (1000.0, 750.0)
result.size: (1000.0, 750.0)
result.imageOrientation: 0
人像:
asset.pixelWidth: 2448
asset.pixelHeight: 3264
targetSize: (1000.0, 1333.33)
result.size: (1000.0, 1332.0)
result.imageOrientation: 3
情况2:iPhone 5(8.3)
景观:
asset.pixelWidth: 3264
asset.pixelHeight: 2448
targetSize: (1000.0, 750.0)
result.size: (1000.0, 750.0)
result.imageOrientation: 0
人像:
asset.pixelWidth: 2448
asset.pixelHeight: 3264
targetSize: (1000.0, 1333.33)
result.size: (1334.0, 1000.0)
result.imageOrientation: 3
案例3:iPhone 6加号(8.3)
景观:
asset.pixelWidth: 3264
asset.pixelHeight: 2448
targetSize: (1000.0, 750.0)
result.size: (1000.0, 750.0)
result.imageOrientation: 0
肖像:
asset.pixelWidth: 2448
asset.pixelHeight: 3264
targetSize: (1000.0, 1333.33333333333)
result.size: (1334.0, 1000.0)
result.imageOrientation: 3
结论
您可以通过日志查看iOS 8.1.2版本尊重targetSize
指定为两个图像,但8.3版本正在提取具有相反尺寸的图像(请求(1000.0, 1333.33)
但收到(1334.0, 1000.0)
)。
现在,好像我唯一的选择是检查它的iOS版本正在运行,然后用旋转方位请求的图像(我只用UIImageOrientation.Right
测试,但也有.Left
,.LeftMirrored
和.RightMirrored
)当反转参数。
不幸的是,PHAsset
不包含图片的方向。我只能在向PHImageManager
请求图像后才知道它,所以我必须为这些图像提出两个请求,一个获取方向,另一个获取正确的图像。
问题
这是我的逻辑问题吗?或者是iOS中的错误?如果这是一个错误,哪一个是正确的行为,那么iOS 8.3的一个或者更老的版本'?任何人都可以提供其他选项来处理这个问题吗?
对不起,对于很长的文章,和糟糕的英语。提前致谢!
PHImageContentMode.AspectFill代替这个可以试试PHImageContentMode.AspectFit吗? – jarora
你曾经解决过这个问题吗? – AnthonyM