2013-10-02 67 views
0

我的应用只有肖像,但是,我想让用户在通过UIWebview观看全屏视频时旋转到风景。我做了一些研究,发现我要补充我的类作为这些通知观察员:UIMoviePlayerControllerWillExitFullscreenNotification没有收到

UIMoviePlayerControllerDidEnterFullscreenNotification UIMoviePlayerControllerWillExitFullscreenNotification

我添加和删除类作为像这样的观察:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerDidEnterFullScreen:) name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillExitFullScreen:) name:@"UIMoviePlayerControllerWillExitFullscreenNotification" object:nil]; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 

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

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

- (void)moviePlayerDidEnterFullScreen:(NSNotification *)notification 
{ 
    self.videoPlayingFullScreen = YES; 
} 

- (void)moviePlayerWillExitFullScreen:(NSNotification *)notification 
{ 
    self.videoPlayingFullScreen = NO; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    if (self.videoPlayingFullScreen) 
    { 
     return UIInterfaceOrientationMaskAllButUpsideDown; 
    } 

    return UIInterfaceOrientationMaskPortrait; 
} 

我的问题是:我从来没有收到“UIMoviePlayerControllerWillExitFullscreenNotification”。我无法使用UIMoviePlayerControllerDidExitFullscreenNotification,因为如果用户完成以横向方向观看全屏视频并按下“完成”,则前一个视图控制器在纵向时也会以横向显示。

是否有另一种方式来检测用户“做”进入全屏和“将”退出全屏?还是有什么我失踪?

编辑: 我的应用程序仅适用于iOS 7。

+1

这些通知没有记录,因此在使用时会有超级风险,因为它们可能会在发布新操作系统更新时破坏应用程序。例如,UIMoviePlayerControllerDidExitFullscreenNotification永远不会在iOS6上发送。 – Till

+0

是否有文档记录的方式来检测UIWebview何时进入并将全屏退出? – Jonathan

+1

按照[此答案](http://stackoverflow.com/a/8554077/91282)所述使用JavaScript事件。 – Till

回答

3

你没有得到的UIMoviePlayerControllerWillExitFullscreenNotification回调的原因是因为你删除自己作为viewWillDisappear:

+0

感谢您的回答。作为观察者,我应该使用哪种方法? – Jonathan

+0

我想'dealloc'。 –

+2

使用dealloc删除通知时,请确保在init方法中附加它们,而不是在外观回调中。 – Till

0

由于这些回调都是无证我使用JavaScript事件(如H2CO3建议here)的观察员,以确定当视频开始,结束或暂停。

顺便说一下,我使用的是YouTube播放器。

首先,我设置UIWebview并将我的ViewController设置为委托。

接下来,我将HTML文件加载到UIWebview中。

的Index.html

<html> 
    <body bgcolor=#8C1717 style="margin:0px;"> 
     <div id="ytplayer"></div> 
     <script type="text/javascript"> 
      var tag = document.createElement('script'); 
      tag.src = "https://www.youtube.com/player_api"; 

      var firstScriptTag = document.getElementsByTagName('script')[0]; 
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); 

      var player; 
      function onYouTubeIframeAPIReady() 
      { 
       player = new YT.Player('ytplayer', 
             { 
             height: 'videoHeight', 
             width: 'videoWidth', 
             videoId: 'videoID', 
             playerVars: { 'showinfo':0, 'rel':0 }, 
             events: { 'onStateChange': onPlayerStateChange } 
             }); 
      } 

      function playerDidBeginPlaying() 
      { 
       document.location.href = "fake://video-began"; 
      } 

      function playerDidEndPlaying() 
      { 
       document.location.href = "fake://video-ended"; 
      } 

      var done = false; 
      function onPlayerStateChange(event) 
      { 
       if (event.data == YT.PlayerState.PLAYING && !done) 
       { 
        done = true; 
        playerDidBeginPlaying(); 
       } 
       else if (event.data == YT.PlayerState.ENDED) 
       { 
        playerDidEndPlaying(); 
       } 
       else if (event.data == YT.PlayerState.PAUSED) 
       { 
        playerDidEndPlaying(); 
       } 
      } 
     </script> 
    </body> 
</html> 

里面的ViewController

NSError *error = NULL; 

    NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]; 
    NSString *html = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; 

    if (error) 
    { 
#ifdef DEBUG 
     NSLog(@"[YouTube Webview] Error: %@", [error description]); 
#endif 
    } 

    [self.webView loadHTMLString:html baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]]; 

然后,我实现了方法webView:shouldStartLoadWithRequest:navigationType:当事件发生时收到通知。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    if ([[[request URL] absoluteString] hasPrefix:@"fake://video-began"]) 
    { 
     self.videoPlayingFullScreen = YES; 

     return NO; 
    } 
    else if ([[[request URL] absoluteString] hasPrefix:@"fake://video-ended"]) 
    { 
     self.videoPlayingFullScreen = NO; 

     return NO; 
    } 

    return YES; 
}