语境
我正在使用Photos 框架在我正在处理的 iOS 应用程序中显示用户图片。
作为参考,我将一些图像上传到 imgur,您可以在其中找到我正在测试的原始图像,以及我拍摄的带有粉红色背景的 UIImageView 的屏幕截图,其中显示了使用“Aspect Fit”配置获取的图像。这是链接:http: //imgur.com/a/VPJ9J
我正在使用两个测试场景:首先,一个风景图像,其imageOrientation
为UIImageOrientation.Up
(0);其次,肖像图像,与UIImageOrientation.Right
(3)。您可以查看文档(我会将链接放在这里,但我没有足够的声誉,抱歉)。
问题
iPhone 4S(iOS 8.1.2)在粉红色的 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)
}
}
测试
以下是我在使用这两个图像执行测试时得到的日志:
案例一: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 Plus (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 还是旧版本?任何人都可以提供其他选择来处理这个问题吗?
对不起,很长的帖子,以及糟糕的英语。提前致谢!