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

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, все приложение допускает только портретный режим.

Спасибо за вашу помощь.

4b9b3361

Ответ 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, это не сработает поэтому будьте осторожны.