2013-03-13 3 views
13

Как мы можем заставить контроллер UIImagePickerController записывать видео только в ландшафтном режиме?UIImagePickerController записывает видео с ориентацией на ландшафт

Я знаю, что этот класс должен использоваться для записи по портрету, но мне нужно иметь его в ландшафте.

Нашли несколько похожих вопросов, но нет никакого решения, которое работает для меня (iOS 6.1).

Для примера наблюдение ориентации устройства не работает для меня (это ответа- https://stackoverflow.com/a/2147584/775779)

Если я реализую UIImagePickerController категории вроде следующего:

#import "UIImagePickerController+NonRotating.h" 

@implementation UIImagePickerController (NonRotating) 

- (BOOL)shouldAutorotate 
{ 

    return YES; 
} 

-(NSUInteger)supportedInterfaceOrientations 

{ 
    return UIInterfaceOrientationMaskLandscape; 

} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return UIInterfaceOrientationLandscapeRight; 
} 

@end 

почти работает, но я вижу некоторые странное поведение некоторых элементов управления и неправильная ориентация видео во время записи (результат видео в порядке).

1) Старт. Отмена и запись кнопки в правильных положениях, но другие элементы управления в неправильном. И видео поворачивается. enter image description here

2) Запись. Таймер и видео ошибочны. enter image description here

3) Запись завершена. все хорошо! и результат видеовстречен.

enter image description here

у вас есть какие-нибудь идеи?

ОБНОВЛЕНИЕ Мне нужно заблокировать экран в альбомной ориентации во время записи.

+3

не закрывайте этот вопрос. вопрос, который вы дали ссылку, не имеет правильного ответа, и все решения из этих комментариев не работают. –

+0

@iPatel вы прочитали мой вопрос? Я уже говорил об этой ссылке. –

+0

Вы пытались установить ориентацию видео? http://stackoverflow.com/questions/14811641/ios-camera-orientation#14812010 – Gotschi

ответ

0

попробовать это на, возможно, это поможет вам w'll

- (BOOL)shouldAutorotate 
{ 
return NO; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
return UIInterfaceOrientationLandscapeRight | UIInterfaceOrientationLandscapeLeft; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
return UIInterfaceOrientationLandscapeRight; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight ||  interfaceOrientation == UIInterfaceOrientationLandscapeLeft); 
} 

это w'lll работать ... :)

+0

спасибо за комментарий. Попробовали, но получили исключение: *** Завершение приложения из-за неотображения исключение 'UIApplicationInvalidInterfaceOrientation', причина: "preferredInterfaceOrientationForPresentation должен вернуть поддерживаемую ориентацию интерфейса! –

+0

который Xcode версии RU с помощью ??? – Kalyani

+0

версии 4.6 (4H127) –

3

Вы должны реализовать пользовательский UIImagePickerController. Для этого вам нужно установить свойство imagepicker showsCameraControls в FALSE.

self.mImagePickerController.showsCameraControls = NO; 
self.mImagePickerController.wantsFullScreenLayout = YES; 

После этого никакие элементы управления по умолчанию не будут видны вам. Вам нужно настроить пользовательские кнопки для запуска/остановки записи и листать камеру и т.д.

Теперь вы можете использовать старт/стоп методы для записи видео:

Когда один нажимает на запись запуска,

[self.mImagePickerController startVideoCapture]; 

Для остановки

[self.mImagePickerController stopVideoCapture]; 

Чтобы отслеживать переключения между камерой, вы можете использовать флаг

if (self.mImagePickerController.cameraDevice == UIImagePickerControllerCameraDeviceRear) 
    { 
     self.mImagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceFront; 
     isFrontCamera = YES; 
    } 
    else 
    { 
     self.mImagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceRear; 
     isFrontCamera = NO; 
    } 

Вы можете установить элементы управления, как вы хотите, при изменении ориентации. AppDelegate.m

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

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

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
    [self.objController shouldAutorotate]; 
    return UIInterfaceOrientationMaskAll; 
} 

Теперь внутри cameraviewcontroller.m

-(BOOL)shouldAutorotate 
{ 
    UIInterfaceOrientation interfaceOrientation = [[UIDevice currentDevice]orientation]; 

    if(interfaceOrientation == UIInterfaceOrientationPortrait) 
    { 
     // your controls setup 
    } 
    else 
    { 
     // view accordingly for landscape 
    } 
} 

Я попытался охватить все точки. Дайте мне знать, если у вас есть путаница. Надеюсь, это поможет :)

1) Вам нужно проверить состояние события щелчка кнопки флип-камеры.

2) AppDelegate.h: Объявите объект своего класса, где вы записываете свое видео и создаете свойство. Здесь я использую в качестве примера CameraViewController.

CameraViewController *objController; 

Сейчас в AppDelegate.m:

self.objController = [[CameraViewController alloc]initWithNibName:@"CameraViewController" bundle:nil]; 

Теперь используйте этот экземпляр для вызова метода shouldAutorotate как я показал выше. И вернуться в альбомной ориентации:

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
    if(isOptionScreenActive == YES) 
    { 
     [self.shareController shouldAutorotate]; 
     return UIInterfaceOrientationMaskLandscape; 
    } 
    else 
    { 
     [self.anotherController shouldAutorotate]; 
     return UIInterfaceOrientationMaskPortrait; 
    } 
} 

Здесь isOptionScreenActive является flag, который устанавливается в viewWillAppear класса записи. Установите его false в viewDidUnload. Или может быть viewWillAppear другого класса.

3) Я использовал cameraviewcontroller.m как пример. Он отражает ваш класс записи. Также в методе shouldAutorotate класса видеозаписи, если обнаруженная ориентация является портретом, просто верните НЕТ. Таким образом, пользовательский интерфейс не изменится, и вы сможете сохранить пользовательский интерфейс только в ландшафте.

+0

благодарит за комментарий. несколько вопросов, прежде чем я попытаюсь реализовать это: 1) «Чтобы отслеживать переключение между камерой, вы можете использовать флаг» - не может понять, где должен быть этот код. 2) «Это делегат, который вызывается при изменении ориентации. Вы можете использовать объект определенного класса, чтобы вызвать его метод toAutorotate и настроить позиции управления камерой в соответствии с ориентацией». - «self.objController» - что это?У меня есть только один экран, на котором я записываю видео. Это должно быть пейзаж. Другие находятся в портретной ориентации. 3) cameraviewcontroller.m - что это? –

+0

, и я вижу, что с вашим решением он будет поддерживать обе ориентации. просто с пользовательскими элементами управления. Мне нужно сделать работу * только * в альбомной ориентации. чтобы заблокировать его. –

+0

Я обновил ответ, чтобы разместить ваши запросы. Посмотрите, помогает ли это. – Maverick

Смежные вопросы