Подтвердить что ты не робот

UIImagePickerController записывает видео с альбомной ориентацией

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

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

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

Например, наблюдение ориентации устройства не работает для меня (этот ответ qaru.site/info/97918/...)

Если я реализую категорию 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

Есть ли у вас какие-либо идеи?

UPDATE Мне нужно заблокировать экран в альбомной ориентации во время процесса записи.

4b9b3361

Ответ 1

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

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

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

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

Когда один клик на начальной записи,

[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

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

-(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 класса видеозаписи, если обнаруженная ориентация является портретом, просто верните НЕТ. Таким образом, пользовательский интерфейс не изменится, и вы сможете сохранить пользовательский интерфейс только в ландшафте.

Ответ 2

попробуйте это, возможно, он поможет вам

- (BOOL)shouldAutorotate
{
return NO;
}

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

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationLandscapeRight;
}

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

он будет работать...:)