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

MPMoviePlayerViewController не автоматически вращается

У меня странное поведение, когда мой MPMoviePlayerViewController не auto -вращается, когда изменяется orientation. Тем не менее, я воссоздал одну и ту же иерархию представлений в новом проекте, и когда игрок MPMoviePlayerViewController поднялся, он повернулся к каждой ориентации. Я просматривал проект, который искал все, что могло бы установить ориентацию явно, но ничего.

Я изложу всю соответствующую информацию здесь и то, что я пробовал до сих пор.

В настоящее время иерархия представлений выглядит следующим образом:

  • Контроллер навигации
  • "Root" View Controller < - контроллер навигации rootViewController
  • "Feed" View Controller < - нажата на стек навигации с помощью Root VC
  • "Предварительный просмотр" Контроллер просмотра < - Представлен как модальный VC из фида
  • Подкласс MPMoviePlayerViewController < - представлен Feed VC через 'presentMoviePlayerViewControllerAnimated'

Каждый класс в иерархии представлений реагирует на shouldAutorotateToInterfaceOrientation с YES только для UIInterfaceOrientationPortrait.

Вещи, которые я пробовал:

  • Вручную отправив стек shouldAutorotateToInterfaceOrientation вверх из VC корневого уровня до MPMoviePlayerViewController
  • Переопределение реализации MPMoviePlayerViewController подкласса MPMoviePlayerViewController shouldAutorotateToInterfaceOrientation для возврата YES как для ориентации ландшафта, так и для всех ориентаций YES.
  • Настройка "Ориентация поддерживаемого устройства" на вкладке сводки проекта.
  • Вызов presentMoviePlayerViewControllerAnimated из других VC, таких как Feed VC

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

4b9b3361

Ответ 1

Решение:

Для тех, кто может столкнуться с этим, причина, по которой видео не вращалась, состояла в том, что я случайно добавил, что RootViewController имеет окно rootViewController, а не UINavigationController.

self.window.rootViewController = navController; 

правильно

self.window.rootViewController = rootViewController;

не

Спасибо, ребята, за вашу помощь и вклад в пути.

Ответ 2

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

MPMoviePlayerViewController *mpviewController = [[MPMoviePlayerViewController alloc]
                    initWithContentURL:[NSURL fileURLWithPath:self.filePath]];
[self.view addSubview:mpviewController.view];
[self setWantsFullScreenLayout:YES]; 

И удалите mpviewController.view, когда MPMoviePlayerPlaybackDidFinishNotification обнаружен. Позвольте мне увидеть ваш успех...

Ответ 3

Я обнаружил, что объекты MPMoviePlayerViewController будут оценивать параметры Info.plist проекта для поддерживаемых ориентаций интерфейса. В моем проекте я только разрешал пейзажные виды в этом файле, чтобы игрок фильма не вращался, даже когда он ответил YES на ландшафтные ориентации в shouldAutorotateToInterfaceOrientation:.

Изменить: Хорошо, хватаясь за соломинку: Вы реализуете automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers в любом из ваших подклассов UIViewController? Если да, и он возвращает NO, ваши подклассы должны перенаправить соответствующие методы на любые дочерние контроллеры после изменения ориентации.

В противном случае есть ли способ увидеть ваш код?

Ответ 4

Я знаю, что это может быть глупое предложение, но убедитесь, что метод shouldAutorotateToInterfaceOrientation в вашем подклассе MPMoviePlayerViewController получает вызов. Может, там что-то пошло не так...

Также убедитесь, что у вас нет 2 подзаголовков, добавленных в основной UIWindow, как указано здесь:

В: Почему мой UIViewController не будет вращаться вместе с устройством?

[...]

  • Свойство UIView контроллера представления встроено внутри UIWindow, но наряду с дополнительным контроллером представления.

Я думаю, что это может также дать вам некоторые проблемы. Вы можете найти более подробную информацию о том, что может пойти не так в ссылке выше.

Ответ 5

Несколько идей:

  • Установлен ли UINavigationController как свойство rootViewController вашего приложения UIWindow? Вы этого не говорили. Вы должны сделать это, а затем добавить вид контроллера навигации в окно.
  • Если вы строите всю иерархию сразу, попробуйте разбить ее. Вы можете добавить кнопку на каждый этап, который добавляет следующий контроллер представления в иерархию.
  • Попробуйте удалить любые анимации из конструкции иерархии контроллера представления. Выполнение нескольких анимаций одновременно может быть проблемой. Например, ему не разрешалось два разных контроллера представления в UINavigationController один за другим с animated:YES. У вас может быть аналогичная проблема.
  • Убедитесь, что вы построили всю иерархию контроллера представления в основном потоке.
  • Удостоверьтесь, что нет другого контроллера представления "берет на себя ответственность" от вращения (как писал @MihaiFratu - это настолько распространенная причина для проблем с ротацией, которые я должен был повторить:-)).

Ответ 6

Используете ли вы раскадровки? Сравните настройки ориентации для ваших UIViewControllers и вашего UINavigationController между вашим сломанным проектом и вашим тестовым проектом. Параметр "Ориентация" в инспекторе атрибутов может блокировать вас в одну ориентацию.

Вы упомянули shouldAutorotateToInterfaceOrientation: и ваши настройки plist, чтобы я не попал в это...

Ответ 7

по вашему запросу есть несколько причин.

*** Вы вызываете MPMoviePlayerViewController.. поэтому примените AutoOrientation на "Feed" View Controller И попробуйте вызвать PushViewController..

*** Используйте MPMoviePlayerController вместо MPMoviePlayerViewController и добавьте subview в FeedViewController..

Пример кода для MPMoviePlayerController -

NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"filename" ofType:@"type"]];
videoPlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; 
videoPlayer.controlStyle = MPMovieControlStyleNone; 
videoPlayer.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.height, self.view.frame.size.width);
[videoPlayer prepareToPlay];
videoPlayer.view.center = self.view.center;
videoPlayer.fullscreen = YES;
[self.view addSubview:videoPlayer.view];
[videoPlayer play];

*** Проверьте настройку целевого объекта Xcode и примените разрешение Все ориентации..

Ответ 8

Вы должны попробовать это (работает для меня):

Объявить файл .h:

BOOL landscape;

.m file:

-(IBAction)PlayMovie:(NSString *)movieName {
    landscape = YES;
    NSBundle *bundle = [NSBundle mainBundle];
    NSString *moviePath = [bundle pathForResource:movieName ofType:@"mp4"];
    NSURL *movieURL = [NSURL fileURLWithPath:moviePath];
    MPMoviePlayerController *theMovie = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
    theMovie.scalingMode = MPMovieScalingModeAspectFill;
    [theMovie play];
    MPMoviePlayerViewController *moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL];
    [self presentMoviePlayerViewControllerAnimated:moviePlayer];
}

-(void)dismissMoviePlayerViewControllerAnimated {
    landscape = NO;
    [self dismissModalViewControllerAnimated:YES];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// You can change the return for your needs.
    if (landscape == YES) {
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    } else { return NO; }
}

То, что я здесь сделал, это создать мой просмотр фильма и установить "пейзаж" BOOL на "YES".

Затем "shouldAutorotateToInterfaceOrientation" обнаружит это и авторотирует ваше представление.

И когда фильм закончен, я установил "пейзаж" в "НЕТ", чтобы представление поворачивалось назад.

Ответ 9

У меня была аналогичная проблема.

Решено:

  • включение всех ориентаций в Ориентациях поддерживаемых интерфейсов (Target > Summary)
  • теперь ваше приложение начнет вращаться во всех ориентациях, если вы этого не хотите, затем пропустите шаг 1, добавьте следующий метод в appDelegate

    • Приложение
    • (NSUInteger): приложение (UIApplication *) поддерживаетсяInterfaceOrientationsForWindow: (UIWindow *) window { return UIInterfaceOrientationMaskAll; }
  • удаление shouldAutorotateToInterfaceOrientation везде

  • добавление следующего метода для просмотра контроллера для поддержки Ориентаций, необходимых для вашего приложения

    • (NSUInteger) supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; }
  • вы можете добавить тот же метод, что и в шаге 4 в подклассе MPMoviePlayerViewController, для любых Ориентаций, необходимых для видеоплеера

Ответ 10

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

iOS6 и подсказка для авторотации

Ответ 11

У меня было много боли с MPMoviePlayerViewController, который должен быть только контроллером, способным поворачиваться с портрета на пейзаж и наоборот. Это приложение iOS7, iOS8 с раскадрой.

Вот решение:

  • Приложение должно включать все возможные требуемые ориентации As on the image
  • Каждый UIViewController, который должен поддерживать только портретный режим, должен реализовать следующие методы, например

    -(BOOL)shouldAutorotate
    {
        return YES;
    }
    
    -(NSUInteger)supportedInterfaceOrientations
    {
        return UIInterfaceOrientationMaskPortrait;
    }
    
  • MPMoviePlayerViewController должен быть расширен, а следующие методы должны быть переопределены следующим образом

    -(BOOL)shouldAutorotate
    {
      return YES;
    }
    
    -(NSUInteger)supportedInterfaceOrientations
    {
      return UIInterfaceOrientationMaskAllButUpsideDown;
    }
    
  • Используйте presentMoviePlayerViewControllerAnimated для отображения MPMoviePlayerViewController

Ответ 12

Добавьте этот метод в AppDelegate.m

Приложение

- (NSUInteger): приложение (UIApplication *) поддерживаетсяInterfaceOrientationsForWindow: (UIWindow *) окно {

if(!ISIPAD)

  {

    if ([[self.window.rootViewController presentedViewController]   isKindOfClass:[MPMoviePlayerViewController class]] && ![[self.window.rootViewController presentedViewController] isBeingDismissed])

    {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
    else
    {
        return UIInterfaceOrientationMaskPortrait;
    }
}
return UIInterfaceOrientationMaskAllButUpsideDown ;

}