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;

除此之外,您必须了解UIImageCGImage 之间存在巨大差异,因为UIImage 包含方向,而CGImage 不包含。在处理图像转换时,通常使用CGImage 并获取其宽度或高度将丢弃方向。这意味着当 CGImage 的方向未向上 (UIImageOrientationUp) 时,其尺寸将翻转。但通常在处理此类图像时,您会根据上下文创建一个CGImage,然后使用[UIImage imageWithCGImage:ref scale:1.0f orientation:originalOrientation]。仅当您希望显式旋转图像以使其没有方向(UIImageOrientationUp)时,您才需要旋转和平移图像并将其绘制到上下文中。

无论如何,这个方向问题现在已经完全解决了,UIImagePNGRepresentation 尊重方向,你有一个来自上面已经写过的CGImage 的图像构造函数,如果我没记错的话,这是过去缺少的。

【讨论】:

以上是关于iOS:renderInContext 和横向方向问题的主要内容,如果未能解决你的问题,请参考以下文章

IOS 6 方向 - 只有一个 Viewcontroller 支持横向和纵向方向 - 否则只支持纵向

在 IOS5 中禁用横向方向

IOS 设备方向卡在纵向模式,没有横向

iOS 8 - UIWindow 方向总是纵向的

在 iPad iOS 4.3 中支持纵向和横向界面方向的最佳实践

Storyboard iOS 5.1 时横向方向不起作用