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
Если видеопроигрыватель правильно вращается в новом проекте с одинаковой иерархией взглядов, что можно получить здесь. Любые идеи относительно того, где ориентация может застревать?
Ответы
Ответ 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 ;
}