iOS(iPad) 摄像头方向

3,258 阅读1分钟

之前自己写了一个扫描二维码Demo,本来在iPhone上跑,最近用iPad也跑一下,发现了一点问题,毕竟自己没开发过iPad App,经过一凡折腾,发现了原来摄像头的方向和屏幕的方向是分开的。

iPad上的方向配置

一般情况下,我们会在项目配置里勾选支持的方向,但是如果选择了Universal,就要留意一下info.plist文件里的配置,iPhoneiPad 是分开配置的

摄像头方向

由于自己不熟悉iPad配置,而且我的iPad锁定了横屏,导致我的扫描二维码Demo里摄像头方向不对,才发现,原来屏幕方向和摄像头方向其实是分开的

     /* 一般扫描二维码的代码 (iOS7之后的)*/
     
    // 创建AVCaptureSession
    AVCaptureSession *captureSession = [[AVCaptureSession alloc] init];
    self.session = captureSession;
    // 配置输入设备
    AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    AVCaptureDeviceInput *inputDevice = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:nil];

    [captureSession addInput:inputDevice];

    // 配置输出模式
    AVCaptureMetadataOutput *captureOutput = [[AVCaptureMetadataOutput alloc] init];
    [captureOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    [captureSession addOutput:captureOutput];
    [captureOutput setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

    // 添加显示内容的layer
    self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:captureSession];
    self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    self.previewLayer.frame = self.view.bounds;
    [self.view.layer addSublayer:self.previewLayer];

弄好扫描代码后,就可以设置摄像头方向了

AVCaptureConnection *previewLayerConnection = self.previewLayer.connection;

    UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation;

    if ([previewLayerConnection isVideoOrientationSupported]) {
        switch (interfaceOrientation) {
            case UIInterfaceOrientationPortrait:
                [previewLayerConnection setVideoOrientation:AVCaptureVideoOrientationPortrait];
                //for portrait
                break;
            case UIInterfaceOrientationLandscapeRight:
                [previewLayerConnection setVideoOrientation:AVCaptureVideoOrientationLandscapeRight]; 
                //home button on right. 
                break;
            case UIInterfaceOrientationLandscapeLeft:
                [previewLayerConnection setVideoOrientation:AVCaptureVideoOrientationLandscapeLeft]; 
                //home button on left. 
                break;
            default:
                [previewLayerConnection setVideoOrientation:AVCaptureVideoOrientationPortrait]; 
                //for portrait upside down. 
                break;
        }
    }

经过一番配置,摄像头的方向终于和屏幕方向一致了。

参考

iphone - iOS: camera orientation - Stack Overflow

iOS 获取屏幕方向,和强制屏幕旋转