AVCaptureSession с проблемой нескольких ориентаций
Я пытаюсь реализовать сканер штрих-кода. У меня есть AVCaptureSession, который принимает видео от AVCaptureDevice. Я хочу поддержать все ориентации. С помощью следующего кода, когда я запускаю приложение, все хорошо в книжной ориентации. Однако в альбомной ориентации вид вращается, а видеовход - нет. Таким образом, я получаю видео с поворотом на 90 градусов.
Когда я реализую - (NSUInteger) метод selectedInterfaceOrientations, тогда все будет привязано к портретной позиции.
Может кто-нибудь сказать мне, как я могу решить эту проблему?
- (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;
}
*/
Редактировать:
Я попробовал следующий код, но ориентация previewLayer все еще перевернута в сторону.
[[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];
}