AVCaptureSession con múltiples orientaciones

Estoy intentando implementar un escáner de código de barras. Tengo un AVCaptureSession que toma video de AVCaptureDevice. Quiero apoyar todas las orientaciones. Con el siguiente código, cuando ejecuto la aplicación, todo está bien en la orientación vertical. Sin embargo, en la orientación horizontal, la vista gira, pero la entrada de video no. Así que termino con un video rotado de 90 grados.

Cuando implemento - (NSUInteger) el método InterinterfaceOrientaciones soportado, entonces todo queda bloqueado en la posición vertical.

¿Alguien puede decirme cómo puedo solucionar este problema?

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self setupCaptureSession];

    _previewLayer.frame = _previewView.bounds;
    _previewView.center = self.view.center;
    _previewView.backgroundColor = [UIColor redColor];
    [_previewView.layer addSublayer:_previewLayer];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self startRunning];
}

-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self stopRunning];
}

-(void) setupCaptureSession
{
    if (_captureSession)
        return;

    _videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    if (!_videoDevice)
    {
        NSLog(@"No video camera on this device");
        return;
    }

    _captureSession = [[AVCaptureSession alloc]init];

    _videoInput = [[AVCaptureDeviceInput alloc]initWithDevice:_videoDevice error:nil];

    if ([_captureSession canAddInput:_videoInput])
    {
        [_captureSession addInput:_videoInput];
    }

    _previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];

    _previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;

}

-(void) startRunning
{
    if (_running)
        return;

    [_captureSession startRunning];
    _running = YES;
}

- (void) stopRunning
{
    if (!_running)
        return;

    [_captureSession stopRunning];
    _running = NO;
}

/*
-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationLandscapeLeft|UIInterfaceOrientationLandscapeRight|UIInterfaceOrientationPortrait|UIInterfaceOrientationPortraitUpsideDown;
}

*/

Editar:

Intenté el siguiente código, pero la orientación de previewLayer todavía está boca abajo / hacia los lados.

    [[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];
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta