【发布时间】:2016-01-17 18:46:29
【问题描述】:
这个很奇怪……
背景:我的 iPad 应用支持横向,不支持纵向。它使用 UIImagePickerController 拍照。拍照后,我将它们显示为 UICollectionView 中的小缩略图。
首先,我注意到当以横向方向拍摄照片时,一切正常。但是,当我以 向左 方向拍摄照片并将获得的图像应用到我的单元格的图像视图时,它会倒置显示。
经过一番搜索,我找到了this answer,它解决了我的问题。基本上,以横向左方向拍摄的照片将其imageOrientation 属性设置为.Down。我使用了这段代码(switch 声明):
extension MyViewController : UIImagePickerControllerDelegate
{
func imagePickerController(picker: UIImagePickerController,
didFinishPickingMediaWithInfo info: [String : AnyObject]
)
{
var image:UIImage!
if (info[UIImagePickerControllerEditedImage] as? Bool) == true {
image = info[UIImagePickerControllerEditedImage] as? UIImage
}
else {
image = info[UIImagePickerControllerOriginalImage] as? UIImage
}
if image == nil {
return
}
switch image.imageOrientation {
case .Up, .UpMirrored:
break
default:
image = UIImage(CGImage: image.CGImage!, scale: 1.0, orientation: UIImageOrientation.Up)
}
到目前为止,一切顺利。
接下来,我想也许我最好存储一个额外的、调整大小的、更接近实际缩略图的原始图像版本,以减少显示多个缩略图时的内存压力:这里,我假设 UIImage存储原始(大)图像,无论它如何调整大小以适应视图的边界。
所以,我用这段代码生成了一个缩略图:
UIGraphicsBeginImageContextWithOptions(newSize, true, 0.0)
image.drawInRect(CGRectMake(0, 0, newSize.width, newSize.height))
let thumbnailImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
现在,同样的情况再次发生在缩略图上:当在左侧横向拍摄时,它会颠倒显示(即使调整大小是基于已经校正了方向的图像)。此外,相同的方向修复将不起作用:记录缩略图的imageOrientation 属性显示它已设置为“.Up”:
switch thumbnailImage.imageOrientation {
case .Up, .UpMirrored:
print("Thumb orientation is UP")
// > THIS CASE ALWAYS RUNS
break
default:
print("Thumb orientation is NOT UP")
// > THIS CASE NEVER RUNS
}
上面的调整大小代码不可能是天生错误的,因为它可以在一个设备方向上工作(横向)!怎么回事?
当我固定原始图像的方向时,也许我应该仅强制垂直翻转缩略图?但这听起来像一个黑客。
我不明白为什么,在以新方向(.Down 固定为 .Up)复制原始图像后,它会竖直显示,但该固定图像的调整大小的副本不会(尽管继承了 @987654331 @ 方向)。
【问题讨论】:
标签: ios uiimageview uiimage core-graphics uiimagepickercontroller