iOS:renderInContext 和横向方向问题
Posted
技术标签:
【中文标题】iOS:renderInContext 和横向方向问题【英文标题】:iOS: renderInContext and Landscape orientation issue 【发布时间】:2014-07-11 09:44:39 【问题描述】:我正在尝试在我的 ios 设备上为某个应用保存当前显示的视图,并且它工作正常。但是,当我尝试将 UIImageView 保存为横向时,我遇到了问题。
请参阅下面描述我的问题的图片:
我正在为这个应用程序使用自动布局,它可以在 iPhone 和 iPad 上运行。似乎 ImageView 总是以纵向模式保存,我现在有点卡住了。
这是我使用的代码:
CGSize frameSize = self.view.frame.size;
if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation))
frameSize = CGSizeMake(self.view.frame.size.height, self.view.frame.size.width);
UIGraphicsBeginImageContextWithOptions(frameSize, NO, 0.0);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGFloat scale = CGRectGetWidth(self.view.frame) / CGRectGetWidth(self.view.bounds);
CGContextScaleCTM(ctx, scale, scale);
[self.view.layer renderInContext:ctx];
[self.delegate photoSaved:UIGraphicsGetImageFromCurrentImageContext()];
UIGraphicsEndImageContext();
期待您的帮助!
【问题讨论】:
您的结果究竟是什么,预期的结果是什么?您将宽度和高度交换为横向,因此您可能也应该进行一些旋转,但这会强制屏幕截图为纵向。 @MaticOblak 问题在于,无论当前界面方向如何,它似乎都以纵向模式从上下文中保存图像。当您查看上面的图片时,当我以纵向模式保存上下文时,一切都很好。但是当我在横向模式下保存上下文时,图像当然会以横向模式显示,但无论上下文的大小,图像总是会被保存,因为它会以纵向模式显示。在这一点上,旋转不会改变任何东西。 【参考方案1】:我仍然不知道您的确切问题是什么,但是使用您的屏幕截图代码会产生一个有点奇怪的图像(没有旋转或任何东西,只是太小了)。你可以试试这个代码吗?
+ (UIImage *)imageFromView:(UIView *)view
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, .0f);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
除此之外,您必须了解UIImage
和CGImage
之间存在巨大差异,因为UIImage
包含方向,而CGImage
不包含。在处理图像转换时,通常使用CGImage
并获取其宽度或高度将丢弃方向。这意味着当 CGImage
的方向未向上 (UIImageOrientationUp
) 时,其尺寸将翻转。但通常在处理此类图像时,您会根据上下文创建一个CGImage
,然后使用[UIImage imageWithCGImage:ref scale:1.0f orientation:originalOrientation]
。仅当您希望显式旋转图像以使其没有方向(UIImageOrientationUp
)时,您才需要旋转和平移图像并将其绘制到上下文中。
无论如何,这个方向问题现在已经完全解决了,UIImagePNGRepresentation
尊重方向,你有一个来自上面已经写过的CGImage
的图像构造函数,如果我没记错的话,这是过去缺少的。
【讨论】:
以上是关于iOS:renderInContext 和横向方向问题的主要内容,如果未能解决你的问题,请参考以下文章
IOS 6 方向 - 只有一个 Viewcontroller 支持横向和纵向方向 - 否则只支持纵向