Разрешить 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
в зависимости от того, как проигрыватель фильма находится в полноэкранном режиме или не. В обратных вызовах, вызываемых для поворота приложения, вы проверяете состояние переменной и в зависимости от этого возврата, если разрешение разрешено или нет.