iOS 以编程方式截屏会弄乱图像
Posted
技术标签:
【中文标题】iOS 以编程方式截屏会弄乱图像【英文标题】:iOS programatically taking a screen shot messes up the image 【发布时间】:2013-09-07 09:37:51 【问题描述】:我想在用户每次按住屏幕一秒钟时截屏,然后打开一个电子邮件窗口让用户发送图像。但我有一个奇怪的问题;如果存在渐变图像,图像就会变得混乱(UIImage
,其中加载了 PNG 渐变 - 将解释)。
所以我创建了一个UILongPressGestureRecgnizer
,将它的minimumPressDuration
设置为1.0f
,并将其作为手势识别器添加到主视图:[self.view addGestureRecognizer:myRecognizer]
。识别器调用一个方法,比如说shareClicked
。我想在其中捕获当前屏幕并弹出带有该图像的电子邮件编辑器。这是我的做法:
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, [UIScreen mainScreen].scale);
else
UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init];
mailComposer.mailComposeDelegate = self;
[mailComposer setSubject:@"Share feature"];
[mailComposer setMessageBody:[NSString stringWithFormat:@"Im sharing this with you cause its cool."] ishtml:NO];
[mailComposer addAttachmentData:UIImagePNGRepresentation(image) mimeType:@"image/png" fileName:@"image"];
[self presentViewController:mailComposer animated:YES completion:NULL];
但是,有一个问题。主视图上有一个表格视图,在第三个单元格中有一个我之前提到的渐变。我不知道如何解释它,但它是这样的:
在图像上可见,顶部有一个渐变,还有一个稍低一些。第一个会正常渲染,而第二个会导致一个奇怪的问题。渐变实际上不是蓝色,而是白色并变为透明。这是黑色表面上的渐变图像:
这是模拟器的屏幕截图:
最后是它在邮件编辑器中的渲染和显示方式:
我做错了什么?问题是什么?它不是模拟器的错,因为它在移动设备上也是一样的。如果这有什么不同,那就是 ios7。
为了清楚起见,顶部渐变是相同的,但呈放射状,并且渲染得非常完美。两种渐变都是 tableview 单元格的子视图。如何解决?希望我们能找到解决方案,因为我确实花了一些时间来“制作”这个问题 :)
【问题讨论】:
您可以将0
传递给UIGraphicsBeginImageContextWithOptions
使其使用主屏幕的比例。
渐变效果如何?您是使用 CGGradient/CGShading 在代码中绘制它,还是加载您单独制作的图像?你提到了一个PNG文件;该文件是有效的标准PNG,还是您需要使用的那种破碎的PNG?检查您的“压缩 PNG 图像”(或其他名称)构建设置并确保它已打开。
另外,您的视图是否覆盖drawRect:
?如果是这样,请编辑您的问题以包括实施。如果不是,它的层是自定义层、具有委托的层还是其contents
设置在其他位置的普通层?无论哪种方式,请编辑您的问题以包含绘制到图层上下文或设置图层contents
的代码。
【参考方案1】:
查看推荐的解决方案 https://developer.apple.com/library/ios/qa/qa1703/_index.html#//apple_ref/doc/uid/DTS40010193,因为 UIGetScreenImage 不再允许
【讨论】:
这个不好,会造成如上图那种难看的白色东西。如何解决?以上是关于iOS 以编程方式截屏会弄乱图像的主要内容,如果未能解决你的问题,请参考以下文章