捕获iPhone屏幕

时间:2015-03-24 07:24:51

标签: ios objective-c

我正在使用以下代码捕获屏幕。之前它工作正常,但现在它重新调整nil图像。我正在使用iPhone 5,5c和5s。

+ (UIImage *)screenshot
{

        CGSize imageSize = CGSizeZero;

        imageSize = [UIScreen mainScreen].bounds.size;

        UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
        CGContextRef context = UIGraphicsGetCurrentContext();
        for (UIWindow *window in [[UIApplication sharedApplication] windows])
        {
            CGContextSaveGState(context);
            CGContextTranslateCTM(context, window.center.x, window.center.y);
            CGContextConcatCTM(context, window.transform);
            CGContextTranslateCTM(context, -window.bounds.size.width * window.layer.anchorPoint.x, -window.bounds.size.height * window.layer.anchorPoint.y);

            if ([window respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)])
            {
                [window drawViewHierarchyInRect:window.bounds afterScreenUpdates:YES];
            }
            else
            {
                [window.layer renderInContext:context];
            }
            CGContextRestoreGState(context);
        }

        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        return image;
}

3 个答案:

答案 0 :(得分:1)

嗯,这段代码对我有用。此代码捕获视图的屏幕截图(此处为self.view)及其所有子视图。用一个词来表示屏幕截图。

+ (UIImage *)screenshot {
   CGRectMake *captureFrame = [[UIScreen mainScreen] bounds]; //The portion and size of the area, you want to capture. I have set it to the size of window
   CALayer *layer;
   layer = self.view.layer;
   UIGraphicsBeginImageContext(self.view.bounds.size); 
   CGContextClipToRect (UIGraphicsGetCurrentContext(),captureFrame);
   [layer renderInContext:UIGraphicsGetCurrentContext()];
   UIImage *screenImage = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();
   return screenImage;
}

希望这有帮助。

答案 1 :(得分:1)

以下是一种用于将UIView捕获到UIImage的方法。

+ (UIImage *)renderView:(UIView *)view toImageWithSize:(CGSize)size {
  UIGraphicsBeginImageContextWithOptions(size, NO, 0.);
  CGContextRef c = UIGraphicsGetCurrentContext();
  [view.layer renderInContext:c];
  UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  return viewImage;
}

然后,您可以使用上述方法的screenshot方法将主窗口的rootViewController渲染为图像:

+ (UIImage *)screenshot {
  UIWindow *mainWindow = [UIApplication sharedApplication].windows.firstObject;
  UIView *mainView = mainWindow.rootViewController.view;
  return [self renderView:mainView toImageWithSize:mainView.bounds.size];
}

我希望这有用。

答案 2 :(得分:1)

现在我正在使用此代码及其工作正常。

+ (UIImage *)screenshot:(UIView *)view
{
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    UIGraphicsBeginImageContextWithOptions(screenRect.size, NO, 0.0);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    [[UIColor blackColor] set];
    CGContextFillRect(ctx, screenRect);
    [view.layer renderInContext:ctx];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;

}