29

我正在尝试使用 facebook 实现共享应用程序。我使用此代码截取屏幕截图:

CGSize imageSize = CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height);
UIGraphicsBeginImageContext(imageSize);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

它在 iOS 6 上运行良好,但在 iOS 7 中图像看起来很糟糕。我使用了这个答案:iOS:以编程方式制作屏幕截图的最快、最高效的方法是什么? 试图修复它,它有帮助,但屏幕截图看起来仍然很糟糕。屏幕得到另一种颜色,并且某些对象(如标签)未显示在拍摄的图像上。有什么帮助吗?

- - 更新 - -

我设法解决了大多数对象,通过将它们更改为保留而不是弱。我的主要问题仍然是我的表格视图,它显示为一个大的白色块(它应该是透明的,带有白色文本的标签,所以我们看到的只是白色单元格)。我确实尝试将表格背景定义为 clearcolor,但没有帮助..

- - 最后更新 - -

这里有很好的答案,与我的问题无关。我想让它在运行 iOS7 但不使用 iOS7 SDK 的设备上工作,因为此时切换项目 SDK 需要付出很多努力,当项目快完成了。

无论如何,我添加了代码的和平,最终解决了我的问题:

此更改简单地解决了问题:

UIGraphicsBeginImageContextWithOptions(imageSize, NO , 0.0f);

代替:

UIGraphicsBeginImageContext(imageSize);
4

5 回答 5

55

自 iOS 7 以来添加了新的API ,它应该提供获取快照的有效方式

  • snapshotViewAfterScreenUpdates:将视图呈现为不可修改的 UIViewcontent

  • resizableSnapshotViewFromRect:afterScreenUpdates:withCapInsets:同样的事情,但有可调整大小的插图

  • drawViewHierarchyInRect:afterScreenUpdates::如果您也需要绘制所有子视图(如标签,按钮......),同样的事情

您可以使用UIView返回的任何 UI 效果,或者在需要导出时像您所做的那样渲染到图像中。

我不知道这种新方法与您提供的方法相比有多好(尽管我记得 Apple 工程师说这种新 API 更有效)

于 2013-09-23T10:20:21.560 回答
30

你可以试试这个

- (UIImage *) screenshot {
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, [UIScreen mainScreen].scale);

    [self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:YES];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}
于 2013-09-25T01:27:50.040 回答
6

在 iOS 8 中:这就是我获取 ScreenShot 的方法

  1. 刚刚添加了一个 UIImageView 和方法来在.h 文件中截屏

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

 -(IBAction)takeSnapShot:(id)sender;

2 添加了用于截屏并在 .m 文件中设置 UIImageView 的代码片段

- (IBAction)takeSnapShot:(id)sender
{
    UIGraphicsBeginImageContext(self.view.bounds.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *snapShotImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    imageView.image = snapShotImage;
}
  1. 下面是我得到的输出。

在此处输入图像描述

于 2015-01-30T12:31:59.890 回答
5

在 iOS7 上,如果您使用,可能会出现故障

[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES]

在正在进行的动画中。设置afterScreenUpdates = NO摆脱故障。

于 2013-10-29T15:26:35.150 回答
0

确保opaque设置为NO

于 2013-09-26T11:10:14.733 回答