2

我有一个使用 AVCaptureVideoPreviewLayer 的 iPhone 相机应用程序。当有人拍摄照片/静止图像时,它会显示在新的 ViewController 中。一旦这个视图控制器被解除,魔法就会发生。

整个应用程序正确旋转,无论是视图控制器;但有一个例外。如果我以一个方向拍照,在新的 ViewController 中旋转设备,然后返回到 AVCaptureVideoPreviewLayer,整个层旋转得很好,除了图像,所以突然输入通过 previewLayer 侧向呈现。

我已经检查过,并尝试为 PreviewLayer 设置框架,但这一切似乎都很好,我在调试时看到的值都是正确的。只是显示的图像偏斜。在使用过程中来回旋转设备可解决此问题。

有没有人见过这个,有没有人知道如何解决这个问题?

4

5 回答 5

2

当界面旋转时,您可以更改 previewLayer 的连接的 videoOrientation

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    self.previewLayer.connection.videoOrientation = self.interfaceOrientation;
}
于 2014-01-31T12:27:48.680 回答
1

由于didRotateFromInterfaceOrientation:在 iOS 8 中已弃用,我更改了连接的视频方向viewDidLayoutSubviews

switch ([UIApplication sharedApplication].statusBarOrientation) {
    case UIInterfaceOrientationPortrait:
        self.captureVideoPreviewLayer.connection.videoOrientation = AVCaptureVideoOrientationPortrait;
        break;
    case UIInterfaceOrientationPortraitUpsideDown:
        self.captureVideoPreviewLayer.connection.videoOrientation = AVCaptureVideoOrientationPortraitUpsideDown;
        break;
    case UIInterfaceOrientationLandscapeLeft:
        self.captureVideoPreviewLayer.connection.videoOrientation = AVCaptureVideoOrientationLandscapeLeft;
        break;
    case UIInterfaceOrientationLandscapeRight:
        self.captureVideoPreviewLayer.connection.videoOrientation = AVCaptureVideoOrientationLandscapeRight;
        break;
    default:
        break;
}
于 2015-01-08T18:30:45.817 回答
0

我过去也遇到过类似的问题。关闭相机控制器后,您可以使用以下方法刷新视图旋转:

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIView *topView = [window.subviews objectAtIndex:0];
[topView removeFromSuperview];
[window addSubview:topView];        

因此,删除显示窗口上最顶部的视图并在窗口上重置它,它应该正确刷新视图旋转。

希望能帮助到你

于 2014-01-28T08:37:25.727 回答
0

AVCaptureVideoPreviewLayer也许,你可以尝试把它放在一个容器中,而不是改变框架,UIView然后设置这个容器的框架。(我修复了 ÀVCaptureVideoPreviewLayer UIView 上的“调整大小”错误this way : sizing directly PreviewLayer had no effect, but sizing its containing)。

或者,也许您可​​以在 viewController 中强制定向viewWillAppear(或viewDidAppear?)

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    // try and force current orientation
    UIApplication *application = [UIApplication sharedApplication];
    UIInterfaceOrientation currentOrientation = application.statusBarOrientation;
    [application setStatusBarOrientation:currentOrientation animated:animated];
}

祝你好运 !

于 2014-01-31T10:46:04.433 回答
0

由于 interfaceOrientation 已被弃用,最新的 swift 2.0 解决方案应为:

let previewLayerConnection = self.previewLayer.connection
let orientation = AVCaptureVideoOrientation(rawValue: UIApplication.sharedApplication().statusBarOrientation.rawValue)
previewLayerConnection.videoOrientation = orientation!
于 2015-12-28T03:13:34.230 回答