为什么我在iOS 7上以编程方式创建的屏幕截图看起来如此糟糕?

时间:2013-09-23 10:08:20

标签: ios objective-c iphone xcode screenshot

我正在尝试与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: what's the fastest, most performant way to make a screenshot programmatically? 试图解决它,它有帮助,仍然截图看起来很糟糕。 屏幕获得另一种颜色,并且一些对象(如标签)未显示在拍摄的图像上。 有什么帮助吗?

---- ----更新

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

----最后更新---

这里有很好的答案,并不是真的与我的问题有关..我想让它在iOS7上运行但不使用iOS7 SDK的设备上工作,因为在这一点上需要花费很多精力来切换项目SDK,当项目快完成时。

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

此更改只是解决了问题:

UIGraphicsBeginImageContextWithOptions(imageSize, NO , 0.0f);

而不是:

UIGraphicsBeginImageContext(imageSize);

5 个答案:

答案 0 :(得分:55)

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

  • snapshotViewAfterScreenUpdates:将视图呈现为具有不可修改的content

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

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

您可以使用针对任何UI效果返回的UIView,或者将其呈现为您需要导出时的图像。

我不知道这个新方法对你提供的VS有多好(虽然我记得Apple工程师说这个新API效率更高)

答案 1 :(得分: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;
}

答案 2 :(得分:6)

  iOS 8中的

:这就是我正在做的事情来获取ScreenShot

  1. 刚刚添加了一个UIImageView和Method来截取 .h文件
  2.   

    @property(弱,非原子)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. 下面是我得到的输出。
    2. enter image description here

答案 3 :(得分:5)

在iOS7上,如果使用

,可能会出现故障
[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES]

正在进行动画制作。设置afterScreenUpdates = NO以消除故障。

答案 4 :(得分:0)

确保opaque设置为NO