最快的方式拍摄UIView的屏幕截图

时间:2014-11-10 11:35:38

标签: ios objective-c iphone

我搜索了很多,但只找到两种方法来拍摄UIView的屏幕截图。 第一个renderInContext: 我以某种方式使用它

CGContextRef context = [self createBitmapContextOfSize:CGSizeMake(nImageWidth, nImageHeight)];
CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, nImageHeight);
CGContextConcatCTM(context, flipVertical);
[self.layer setBackgroundColor:[UIColor clearColor].CGColor];
[self.layer renderInContext:context];
CGImageRef cgImage = CGBitmapContextCreateImage(context);
UIImage* background = [UIImage imageWithCGImage: cgImage];
CGImageRelease(cgImage);

我用作

的第二个drawViewHierarchyInRect:
UIImage *background = nil;

UIGraphicsBeginImageContextWithOptions (self.bounds.size, NO, self.window.screen.scale);

if ([self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)])
{
    [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];   
}
background = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

我知道第二个比第一个更快,因为视图尺寸较小,所以它适用于iPhone。但是当我从iPad上捕捉时,视频变得生涩。 可以任何身体告诉我更快的拍摄屏幕的方法。 任何帮助将受到高度赞赏

3 个答案:

答案 0 :(得分:3)

关于性能,Apple Docs说明如下:

  

除了-drawViewHierarchyInRect:afterScreenUpdates:,UIView   现在提供另外两个快照相关的方法,   -snapshotViewAfterScreenUpdates:和-resizableSnapshotViewFromRect:afterScreenUpdates:withCapInsets:。 UIScreen还有-snapshotViewAfterScreenUpdates:。

     

与UIView的-drawViewHierarchyInRect:afterScreenUpdates:不同,这些   方法返回一个UIView对象。如果您正在寻找新的快照   查看,使用其中之一   这些方法。 这比打电话更有效率   -drawViewHierarchyInRect:afterScreenUpdates:自己将视图内容渲染为位图图像。您可以使用返回的视图   作为应用中当前视图/屏幕的可视化替身。对于   例如,您可以将快照视图用于更新a的动画   大视图层次结构可能很昂贵。

答案 1 :(得分:3)

拍摄快照的第三种方法比其中任何一种快得多,但它会返回UIView

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates

如果您只是将快照用作背景"图像"等等...然后我改用它。

但是,这仅适用于iOS8。

使用它只是做...

UIView *snapshotView = [someView snapshotViewAfterScreenUpdates:YES];

答案 2 :(得分:2)

此方法将返回特定视图的快照图像

-(UIImage *)createSnapShotImagesFromUIview
{
    UIGraphicsBeginImageContext(CGSizeMake(view.frame.size.width,view.frame.size.height));
    CGContextRef context = UIGraphicsGetCurrentContext();
    [mapView.layer renderInContext:context];
    UIImage *img_screenShot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
     return img_screenShot;
}