Разрешить UIInterfaceOrientationLandscape во время воспроизведения видео в UIWebView

Мое приложение для iPhone - это приложение, ориентированное только на портретную ориентацию, и в моем приложении у меня есть UITableView, у которого есть UIWebView в первом UITableCell. UIWebView показывает встроенное видео с YouTube. Когда я нажимаю на видео для воспроизведения, он переходит в полноэкранный режим. Мне нужно сделать, чтобы пользователь мог повернуть свое устройство и воспроизвести видео в ландшафтном режиме. Затем, когда видео остановлено, разрешите только портрет. Я настраиваю прослушивание уведомления, когда видео входит в полноэкранный режим и выходит из полноэкранного режима. Но я не знаю, как программно разрешить пользователю поворачивать ориентацию интерфейса.

так что в основном у меня есть 2 метода, которые вызывают при передаче уведомления

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(youTubeStarted:) name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(youTubeFinished:) name:@"UIMoviePlayerControllerDidExitFullscreenNotification" object:nil];

-(void)youTubeStarted:(NSNotification *)notification{
    // Entered fullscreen code goes here.
}

-(void)youTubeFinished:(NSNotification *)notification{
    // Left fullscreen code goes here.
}

Что бы я поместил в эти 2 метода, чтобы изменить ориентацию только во время воспроизведения видео?

Ответ 1

Я понял это. В моих двух методах:

-(void)youTubeStarted:(NSNotification *)notification{
   // Entered Fullscreen code goes here..
   AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
   appDelegate.fullScreenVideoIsPlaying = YES;
}

-(void)youTubeFinished:(NSNotification *)notification{
   // Left fullscreen code goes here...
   AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
   appDelegate.fullScreenVideoIsPlaying = NO;

   //CODE BELOW FORCES APP BACK TO PORTRAIT ORIENTATION ONCE YOU LEAVE VIDEO.
   [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO];
    //present/dismiss viewcontroller in order to activate rotating.
    UIViewController *mVC = [[UIViewController alloc] init];
    [self presentModalViewController:mVC animated:NO];
    [self dismissModalViewControllerAnimated:NO];
}

Я получил доступ к моему делегату приложения в вышеуказанных методах, установив свойство BOOL моего AppDelegate. Затем я вызвал метод приложения ниже в своем AppDelegate.m:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
NSUInteger orientations = UIInterfaceOrientationMaskPortrait;
if (self.fullScreenVideoIsPlaying == YES) {
    return UIInterfaceOrientationMaskAllButUpsideDown;
}
else {
    if(self.window.rootViewController){
        UIViewController *presentedViewController = [[(UINavigationController  *)self.window.rootViewController viewControllers] lastObject];
        orientations = [presentedViewController supportedInterfaceOrientations];

    }
    return orientations;
}
}

self.fullScreenVideoIsPlaying - это BOOL, который я задал как свойство в файле AppDelegate.h.

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

Ответ 2

Если вы хотите только поддержать воспроизведение в полноэкранном режиме. Начиная с iOS 8, видео с UIWebView воспроизводится внутри AVPlayerViewController.

В приложении AppDelegate проверьте, содержит ли отображаемое окно AVPlayerViewController.

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {

    if let w = window, let root = w.rootViewController {

        if root.childViewControllers.first is AVPlayerViewController {  
            return UIInterfaceOrientationMask.allButUpsideDown
        }
    }

    return UIInterfaceOrientationMask.portrait
}

Ответ 3

У вас будет глобальная переменная состояния, возможно, в вашем делете приложения или где бы вы не сохранили переменные, которые должны быть доступны на глобальном уровне, а затем установите для них значение true или false в зависимости от того, как проигрыватель фильма находится в полноэкранном режиме или не. В обратных вызовах, вызываемых для поворота приложения, вы проверяете состояние переменной и в зависимости от этого возврата, если разрешение разрешено или нет.