MPMoviePlayerViewController | Разрешить пейзаж
Я пытаюсь передать видео в мое приложение. Метод, который я нашел, это:
NSURL *theMovieURL = [NSURL URLWithString:self.data.trailer];
if (theMovieURL)
{
self.movieController = [[MPMoviePlayerViewController alloc] initWithContentURL:theMovieURL];
[self presentMoviePlayerViewControllerAnimated:self.movieController];
[self.movieController.moviePlayer play];
}
Я не уверен, что он самый обычный, но он работает.
Проблема в том, что я не могу понять, как разрешить ландшафтный режим, только для видео. Должен ли я использовать что-то вроде shouldAutorotate
или shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
и как?
FYI, все приложение допускает только портретный режим.
Спасибо за вашу помощь.
Ответы
Ответ 1
shouldAutoRotate
устарел с iOS 6, и его следует избегать, если вы не идете < 6.
Вместо этого вы хотите переопределить методы supportedInterfaceOrientations
и preferredInterfaceOrientationForPresentation
.
В этом случае, если вы не хотите подклассифицировать медиаплеер, вы можете переопределить метод в делегате приложения так:
- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if ([[self.window.rootViewController presentedViewController] isKindOfClass:[MPMoviePlayerViewController class]])
{
return UIInterfaceOrientationMaskAllButUpsideDown;
}
else
{
return UIInterfaceOrientationMaskPortrait;
}
}
Ответ 2
@peko говорит правильный путь. когда пользователь выходит из полноэкранного видео, этот метод снова вызывает класс MPMoviePlayerViewController
. вы должны проверить, что он уволен или нет, если вы этого не сделаете, когда пользователь выходит из видео, главное окно останется в ландшафтном режиме, а также вы забыли класс MPInlineVideoFullscreenViewController
. когда вы используете встроенный проигрыватель (не полноэкранный), он вызывается с этим именем класса.
Я сделал это так. он работает для меня.
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)windowx
{
if ([[self.window.rootViewController presentedViewController] isKindOfClass:[MPMoviePlayerViewController class]] ||
[[self.window.rootViewController presentedViewController] isKindOfClass:NSClassFromString(@"MPInlineVideoFullscreenViewController")])
{
if ([self.window.rootViewController presentedViewController].isBeingDismissed)
{
return UIInterfaceOrientationMaskPortrait;
}
else
{
return UIInterfaceOrientationMaskAllButUpsideDown;
}
}
else
{
return UIInterfaceOrientationMaskPortrait;
}
}
Ответ 3
Проигрыватель фильмов может не быть первым представленным контроллером представления, поэтому вы должны сделать что-то вроде этого
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
UIViewController* playerController = self.window.rootViewController.presentedViewController;
while (playerController && ![playerController isKindOfClass:[MPMoviePlayerViewController class]]) {
playerController = playerController.presentedViewController;
}
if (playerController && !playerController.isBeingDismissed) {
return UIInterfaceOrientationMaskAllButUpsideDown;
} else {
return UIInterfaceOrientationMaskPortrait;
}
}
Хотя MPMoviePlayerViewController
устарел, поэтому вместо этого следует использовать AVPlayerViewController
и проверить его класс в этом цикле.
Ответ 4
Лучше всего реализовать эту функцию AppDelegate и проверить, есть ли у rootViewController
дочерний тип типа AVPlayerViewController
или MPMoviePlayerViewController
, после чего вы возвращаете [.portrait, .landscapeLeft, .landscapeRight]
и еще .portrait
.
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
if let _ = UIApplication.shared.keyWindow?.rootViewController?.childViewControllers.first as? AVPlayerViewController {
return [.portrait, .landscapeLeft, .landscapeRight]
}
return .portrait
}
Вы должны проверить keyWindow
UIApplication
, потому что apple представляет этот viewController в другом UIWindow
, поэтому, если вы попытаетесь выполнить эту проверку в окне, объявленном в AppDelegate
, это не сработает поэтому будьте осторожны.