2014-11-02 2 views
5

У меня возникают проблемы с захватом, когда проигрыватель YouTube войдет в полноэкранный режим или выйдет из полноэкранного режима в iOS 8, потому что эти уведомления были удалены UIMoviePlayerControllerDidEnterFullscreenNotification и UIMoviePlayerControllerWillExitFullscreenNotification для этой версии ОС версия.Правильно принудительно или разрешить ландшафтный режим для встроенного видео Youtube в iOS 8 без NSNotificationCenter

Поскольку мой проект приложения установлен только в портретном режиме, видеоролик не будет вращаться в ландшафтном режиме, когда воспроизводится, что действительно не очень удобно для просмотра видео на вашем устройстве.

Обычно пользователь хочет посмотреть видео в портретном или альбомном режиме, когда видео входит в полноэкранный режим.

Это так, как я делал это для IOS 7, который работал идеально, но не в прошивкой 8.

Во-первых, я установить эту функцию в моей AppDelegate.m с логическое свойство в моем AppDelegate.h, который я назвал videoIsInFullscreen и функции,

// this in the AppDelegate.h 
@property (nonatomic) BOOL videoIsInFullscreen; 


// This in my AppDelegate.m to allow landscape mode when the boolean property is set to yes/true. 
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ 
    if(self.videoIsInFullscreen == YES) 
    { 
     return UIInterfaceOrientationMaskAllButUpsideDown; 
    } 
    else 
    { 
     return UIInterfaceOrientationMaskPortrait; 
    } 
} 

Тогда в моей ViewController.m во-первых, я бы #import "AppDelegate.h" после делать это, я добавлю несколько уведомлений в моем viewDidLoad методе ..

-(void)viewDidLoad { 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerStarted) name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerEnded) name:@"UIMoviePlayerControllerWillExitFullscreenNotification" object:nil]; 

} 

Конечно, не забудьте удалить их ..

-(void)dealloc { 

    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIMoviePlayerControllerWillExitFullscreenNotification" object:nil]; 

} 

Тогда, я имел мои функции, которые будут получать вызываемые когда эти уведомления получить пожары ... Вот где я позволяю пейзаж и затем верните его в портрет. Это касается моего приложения, потому что оно настроено только на портретную поддержку, но я не хочу этого для видео YouTube.

// first we set our property in the our AppDelegate to YES to allow landscape mode 
- (void)playerStarted 
{ 
    ((AppDelegate*)[[UIApplication sharedApplication] delegate]).videoIsInFullscreen = YES; 

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; 
} 

// Then I will set the property to NO and force the orientation to rotate to portrait. 
- (void)playerEnded 
{  
    ((AppDelegate*)[[UIApplication sharedApplication] delegate]).videoIsInFullscreen = NO; 

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; 
} 

Но это не так для прошивки 8 .. Эти уведомления больше не работают для прошивки 8 так, я нашел что-то подобное, используя эти уведомления, но я не слишком счастлив, потому что они не являются 100% точными для видеоплеер. UIWindowDidBecomeVisibleNotification и UIWindowDidBecomeHiddenNotification Итак, как я могу сделать это правильно или, по крайней мере, правильно работает для моего встроенного видео YouTube и разрешить ландшафтный режим в iOS 8 ...?

ответ

3

Итак, после некоторых исследований и углубленного изучения этой проблемы. Я пришел к решению, используя делегатов UIWebView, плюс мне пришлось решить еще одну проблему с точки зрения моей функции - (void)playerEnded, которая не работала должным образом в новых устройствах iPhone 6 ..

Это, как я сделал это .. во-первых, в моем webViewDidFinishLoad метода, который я добавил к моему WebView в яваскрипта оценку, чтобы проверить, когда это видео проигрыватель переходит в полноэкранный режим ..

- (void)webViewDidFinishLoad:(UIWebView*)webView 
{ 
    // adding listener to webView 
    [_webView stringByEvaluatingJavaScriptFromString:@" for (var i = 0, videos = document.getElementsByTagName('video'); i < videos.length; i++) {" 
                @"  videos[i].addEventListener('webkitbeginfullscreen', function(){ " 
                @"   window.location = 'videohandler://begin-fullscreen';" 
                @"  }, false);" 
                @"" 
                @"  videos[i].addEventListener('webkitendfullscreen', function(){ " 
                @"   window.location = 'videohandler://end-fullscreen';" 
                @"  }, false);" 
                @" }" 
                ]; 
} 

Затем, в моем методе - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType, я проверяю, когда мой request url соответствует состоянию проигрывателя YouTube, например, это. Это приведет к тому, что наша функция позволит использовать ландшафтный режим или вернуться в портретный режим .. или, возможно, любой другой вид работы, который вы, возможно, захотите сделать.

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    // allows youtube player in landscape mode 
    if ([request.URL.absoluteString isEqualToString:@"ytplayer://onStateChange?data=3"]) 
    { 
     [self playerStarted]; 

     return NO; 
    } 
    if ([request.URL.absoluteString isEqualToString:@"ytplayer://onStateChange?data=2"]) 
    { 
     [self playerEnded]; 

     return NO; 
    } 
} 

И, наконец, мне нужно было настроить функцию playerEnded, чтобы принудительно вернуть портретный режим для устройств iPhone 6.

- (void)playerEnded 
{ 
    [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIInterfaceOrientationPortrait] forKey:@"orientation"]; 

    ((AppDelegate*)[[UIApplication sharedApplication] delegate]).videoIsInFullscreen = NO; 

    [self supportedInterfaceOrientations]; 

    [self shouldAutorotate:UIInterfaceOrientationPortrait]; 

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; 
} 

Почти, пропустил я также добавил эти две другие функции ..

- (NSInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

- (BOOL)shouldAutorotate:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

Итак, наконец-то я могу поймать состояние фактического игрока и стрелять мои функции, чтобы сделать какую-то работу или что-то Я хочу, чтобы в нужный момент, в моем изменяющего ориентацию случае ..

Я надеюсь, что это помогает кто-то еще ..

+0

попробовал - не дотягивал -playerStarted и игрок закончился. equest.URL.absoluteString в основном о: blank и http: //www.youtube.com/embed/..... - и это до воспроизведения видео. Когда воспроизводится видео, должен запускаться запускStartLoadWithRequest. есть идеи? – Boaz

+0

shouldStartLoadWithRequest загорается, когда видео воспроизводится, и вы можете поймать состояние, как показано выше. Я не уверен, правильно ли я правильно понял ваш вопрос. В нем нет уведомлений .. это работает, если вы используете встроенное видео youtube внутри iframe в веб-просмотре. – NorthBlast

+0

ну, это не так :(Я поставил NSLog (@ "URL:% @", request.URL .absoluteString), в начале функции, и я не получаю отпечатков при нажатии на игру – Boaz

0

Я работаю над быстрым, я плеер работает фильм как в портретном и л andscape направлении. Сначала я проверил три режима: портрет, пейзаж, ландшафт. Во-вторых, я написал эту функцию во всех ViewController:

isFullScreen = false 
override func shouldAutorotate() -> Bool { 
    if isFullScreen == true { 
     return true 
    }else{ 
     return false 
    } 
} 

Третье изменить значение isFullScreen в этой функции:

func playerView(playerView: YTPlayerView!, didChangeToState state: YTPlayerState) { 
    switch (state) { 
     case YTPlayerState.Playing: 
       println("started to play") 
     isFullScreen == true 
     shouldAutorotate() 
     case YTPlayerState.Paused: 
       println("paused") 
     default: 
      println("non of sttate") 
     break 
    } 
} 

и видео работает как в портретной и ландшафтном режиме! Интересно, что я не устанавливаю isFullScreen в false снова, когда я приостанавливаю видео или перехожу из полноэкранного режима. Однако он не вращается! Может ли кто-нибудь объяснить это?