是否可以拍摄包括相机在内的组合视图的快照?

Is it possible to take a snapshot of combined views including the camera?

我的应用程序有一个按钮,可以通过调用 "takeSnapShot" 截取屏幕上的任何内容(请参见下面的代码)。 我有两个视图,其中一个是用于相机的选择器视图,因此在屏幕上我看到来自相机的图像,旁边是另一个带有图像的视图。

问题是我捕获了屏幕,但它没有捕获来自相机的图像。

此外,我想我渲染了 view.layer 但调试器一直说>

"Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates."

有什么想法吗?谢谢!

这是代码:

#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController

UIImage *capturaPantalla;


-(void)takeSnapShot:(id)sender{

   UIGraphicsBeginImageContext(picker.view.window.bounds.size);
   [picker.view.layer renderInContext:UIGraphicsGetCurrentContext()];
   capturaPantalla = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   UIImageWriteToSavedPhotosAlbum(capturaPantalla,nil,nil,nil);

}

我之前做过类似的功能,用AVCaptureSession做的

 // 1. Create the AVCaptureSession
    AVCaptureSession *session = [[AVCaptureSession alloc] init];
    [self setSession:session];

 // 2. Setup the preview view
    [[self previewView] setSession:session];

 // 3. Check for device authorization
    [self checkDeviceAuthorizationStatus];

    dispatch_queue_t sessionQueue = dispatch_queue_create("session queue", DISPATCH_QUEUE_SERIAL);
    [self setSessionQueue:sessionQueue];

========================================= 我的倒计时快照功能:

- (void) takePhoto
{
    [timer1 invalidate];
    dispatch_async([self sessionQueue], ^{
        // 4. Update the orientation on the still image output video connection before capturing.
        [[[self stillImageOutput] connectionWithMediaType:AVMediaTypeVideo] setVideoOrientation:[[(AVCaptureVideoPreviewLayer *)[[self previewView] layer] connection] videoOrientation]];

        // 5. Flash set to Auto for Still Capture
        [iSKITACamViewController setFlashMode:flashMode forDevice:[[self videoDeviceInput] device]];

        AVCaptureConnection *stillImageConnection = [[self stillImageOutput] connectionWithMediaType:AVMediaTypeVideo];

        CGFloat maxScale = stillImageConnection.videoMaxScaleAndCropFactor;
        if (effectiveScale > 1.0f && effectiveScale < maxScale)
        {
            stillImageConnection.videoScaleAndCropFactor = effectiveScale;;
        }

        [self playSound];
        // 6.Capture a still image.
        [[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:[[self stillImageOutput] connectionWithMediaType:AVMediaTypeVideo] completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {

            if (imageDataSampleBuffer)
            {
                NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
                UIImage *image = [[UIImage alloc] initWithData:imageData];
                if(iPhone5 && [self.modeLabel.text isEqualToString:@"PhotoMode"]) {
                    UIImage *image1 = [image crop:CGRectMake(0, 0, image.size.width, image.size.height)];
                    [[[ALAssetsLibrary alloc] init] writeImageToSavedPhotosAlbum:[image1 CGImage] orientation:(ALAssetOrientation)[image1 imageOrientation] completionBlock:nil];
                } else {
                    [[[ALAssetsLibrary alloc] init] writeImageToSavedPhotosAlbum:[image CGImage] orientation:(ALAssetOrientation)[image imageOrientation] completionBlock:nil];

                }
                self.priveImageView.image = image;
            }
        }];
    });
}