5

我正在尝试使用 AVCaptureVideoPreviewLayer 让相机以横向模式显示,但无论我做什么,在横向模式下,相机总是只显示在屏幕的一半上。

我有它所以我的应用程序只支持横向右,并且当应用程序启动时视图方向显然是横向右,但是当我将视频预览层的框架设置为视图的边界时,它就好像它仍然在纵向模式。如果我记录视图的宽度和高度,它会打印 320x568 而不是 568x320。

我已经搜索并查看了与我正在尝试做的事情相关的每个线程和指南,但还没有找到适用于其中任何一个的解决方案。

这是我的代码(在 viewDidLoad 中):

    // Create video preview layer and add it to the UI
    self.videoLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureManager.captureSession];

    [[self.view layer] setMasksToBounds:YES];

    self.videoLayer.frame = self.view.bounds;

    if(self.videoLayer.connection.supportsVideoOrientation)
    {
        self.videoLayer.connection.videoOrientation = AVCaptureVideoOrientationLandscapeRight;
    }

    [self.videoLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

    [self.view.layer addSublayer:self.videoLayer];

    [self.captureManager.captureSession startRunning];

上面的代码在我的设备上产生了这个结果:http: //i.imgur.com/Yz1Bgow.jpg

任何帮助将不胜感激。

编辑:

所以我想出了一个解决方案。我不知道是否有办法解决这个问题,但这是我能想到的唯一方法,所以在相机出现之前不会有任何延迟。我基本上只是用视图的翻转宽度和高度制作了一个新的 CGRect。

这是固定代码:

    // Create video preview layer and add it to the UI
    self.videoLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureManager.captureSession];

    [self.view.layer setMasksToBounds:YES];

    CGSize landscapeSize;
    landscapeSize.width = self.view.bounds.size.height;
    landscapeSize.height = self.view.bounds.size.width;

    CGRect landscapeRect;
    landscapeRect.size = landscapeSize;
    landscapeRect.origin = self.view.bounds.origin;

    self.videoLayer.frame = landscapeRect;

    //NSLog(@"%f, %f", self.view.frame.size.width, self.view.frame.size.height);

    if(self.videoLayer.connection.supportsVideoOrientation)
    {
        self.videoLayer.connection.videoOrientation = AVCaptureVideoOrientationLandscapeRight;
    }

    [self.videoLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

    [self.view.layer addSublayer:self.videoLayer];

    [self.captureManager.captureSession startRunning];
4

0 回答 0