iOS: ориентация камеры

Я хочу захватить изображение камерой с помощью AVCaptureSession.

Все работает нормально, я запускаю камеру и могу получить результат. Однако у меня возникают проблемы с ориентацией видео при повороте устройства.

Во-первых, я хочу поддерживать альбомную левую и правую ориентацию, а позже, возможно, и портретные режимы.

Я реализую:

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation{ 
return UIInterfaceOrientationIsLandscapse(interfaceOrientation);
}

Когда я поворачиваю устройство, оно поворачивает приложение из альбомной ориентации влево в альбомную вправо или наоборот, но я правильно вижу камеру, только когда нахожусь в альбомной ориентации слева. Когда приложение находится в альбомной ориентации справа, видео поворачивается на 180 градусов.

Большое Вам спасибо.

Обновление:

Я пробовал ответить Spectravideo328, но у меня возникает ошибка при попытке повернуть устройство и сбой приложения. Это ошибка:

[AVCaptureVideoPreviewLayer connection]: unrecognized selector sent to instance 0xf678210

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AVCaptureVideoPreviewLayer connection]: unrecognized selector sent to instance 0xf678210'

Ошибка возникает в этой строке:

AVCaptureConnection *previewLayerConnection=self.previewLayer.connection;

Я поместил его в метод shouldAutorotateToInterfaceOrientation. Вы знаете, что может быть причиной этой ошибки?

Спасибо


person A.Vila    schedule 11.02.2013    source источник


Ответы (1)


Ориентация камеры по умолчанию, как ни странно, UIInterfaceOrientationLeft.

Ориентация камеры не меняется при повороте устройства. Они отдельные. Вы должны настроить ориентацию камеры вручную:

Поместите следующее в метод, которому вы передаете toInterfaceOrientation (возможно, вы вызываете его из shouldAutorotateToInterfaceOrientation выше, чтобы устройство вращалось, а камера вращалась):

Сначала вы должны получить подключение к предварительному слою.

AVCaptureConnection *previewLayerConnection=self.previewLayer.connection;

if ([previewLayerConnection isVideoOrientationSupported])
{
    switch (toInterfaceOrientation)
    {
        case UIInterfaceOrientationPortrait:
            [previewLayerConnection setVideoOrientation:AVCaptureVideoOrientationPortrait];
            break;
        case UIInterfaceOrientationLandscapeRight:
            [previewLayerConnection setVideoOrientation:AVCaptureVideoOrientationLandscapeRight]; //home button on right. Refer to .h not doc
            break;
        case UIInterfaceOrientationLandscapeLeft:
            [previewLayerConnection setVideoOrientation:AVCaptureVideoOrientationLandscapeLeft]; //home button on left. Refer to .h not doc
            break;
        default:
            [previewLayerConnection setVideoOrientation:AVCaptureVideoOrientationPortrait]; //for portrait upside down. Refer to .h not doc
            break;
    }
}
person Khaled Barazi    schedule 11.02.2013
comment
Это решение не работает для меня. Это ничего не делает... Я решаю проблему, используя [self.prevLayer setOrientation:[[UIDevice currentDevice] ориентация]]. Но setOrientation устарел, так что это не очень хорошее решение. Спасибо - person A.Vila; 13.02.2013
comment
@A.Vila, вы упомянули в вопросе ориентацию камеры, а не ориентацию слоя предварительного просмотра. Просто для справки в будущем, AVCaptureSession создает 2 отдельных соединения (для слоя предварительного просмотра и вывода камеры), и вам придется вращать оба по отдельности! Я обновил свой ответ для ориентации слоя предварительного просмотра выше. - person Khaled Barazi; 13.02.2013
comment
Спасибо за Ваш ответ. Я пробовал, но у меня ошибка. Я обновляю вопрос с информацией об ошибке. Вы знаете, в чем проблема? Большое спасибо. - person A.Vila; 09.05.2013
comment
На ios 6 работает, спасибо. Для более ранних версий может быть полезен следующий код: if ([self.prevLayer isOrientationSupported]){ self.prevLayer.orientation = newOrientation;} - person A.Vila; 14.05.2013
comment
Не любите портрет вверх ногами? Если хотите, добавьте четвертый случай: case UIInterfaceOrientationPortraitUpsideDown:[previewLayerConnection setVideoOrientation:AVCaptureVideoOrientationPortraitUpsideDown];break; - person Kpmurphy91; 18.03.2014
comment
Этот код работает с iOS7 и 8.1. Спасибо! // Я использую UIInterfaceOrientation interfaceOrientation = [self interfaceOrientation];, потому что shouldAutorotateToInterfaceOrientation устарел.. - person ecth; 17.11.2014