mafioso mafioso - 4 months ago 58
Swift Question

Camera just works in Portrait mode

My camera looks like this in portrait mode:

enter image description here

and like that in landscape mode:

enter image description here

So my questions are:


  1. how can I set the previewLayer there in fullscreen in landscape mode?

  2. why doesn't the camera rotate when i rotate the device? It stays always in portrait mode


Answer

You should set your AVCaptureSession orientation every time device's orientation is changed.

Add a Notification observer to observe any change in device orientation then set AVCaptureSession orientation according to device orientation.

Obj-C:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(orientationChanged)
                                             name:UIDeviceOrientationDidChangeNotification
                                           object:nil];
-(void) orientationChanged
{
    if (self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
        [_previewLayer.connection setVideoOrientation:AVCaptureVideoOrientationPortraitUpsideDown];

    if (self.interfaceOrientation == UIInterfaceOrientationPortrait)
        [_previewLayer.connection setVideoOrientation:AVCaptureVideoOrientationPortrait];

    if (self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft)
        [_previewLayer.connection setVideoOrientation:AVCaptureVideoOrientationLandscapeLeft];

    if (self.interfaceOrientation == UIInterfaceOrientationLandscapeRight)
        [_previewLayer.connection setVideoOrientation:AVCaptureVideoOrientationLandscapeRight];
}

Swift 2:

Add observer somewhere, for example in viewDidLoad method.

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(orientationChanged), name: UIDeviceOrientationDidChangeNotification, object: nil)

Then:

func orientationChanged(){
    let deviceOrientation = UIDevice.currentDevice().orientation

    if deviceOrientation == UIDeviceOrientation.PortraitUpsideDown {
        previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.PortraitUpsideDown
    }
    else if deviceOrientation == UIDeviceOrientation.Portrait {
        previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.Portrait
    }
    else if deviceOrientation == UIDeviceOrientation.LandscapeLeft {
        previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.LandscapeLeft
    }
    else if deviceOrientation == UIDeviceOrientation.LandscapeRight {
        previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.LandscapeRight
    }
}

You can also provide any of your code or look at this question which has been asked before it may help. AVCaptureSession with multiple orientations issue

Comments