在UIBebView中播放YouTube视频。如何处理"done"按钮?



我有一个uiwebview播放youtube视频。我如何处理完成按钮动作?现在,当我点击完成按钮时,它会回到我的应用程序主菜单(而不是应该解散的菜单),它只是冻结。有人能帮帮我吗?

Ps: uiwebview所在的菜单,之前是模态呈现的

YouTube插件播放器本身就是一个模态视图控制器。当完成按钮被按下时,它返回到它的presentingViewController。它的presentingViewController不是你的模态视图控制器,而是viewController调用[presentModalViewController:animated:]来呈现你的模态视图控制器。由于原来的模态视图控制器仍然是活动的,应用程序的行为很糟糕。

要解决这个问题,

1)跟踪模态视图控制器是否已经呈现但没有被取消。

2)在呈现视图控制器的viewDidAppear方法中,如果模态视图控制器被呈现而未被解散,则解散并再次呈现。

例如,在呈现模态web视图的控制器中:

 - (void) presentModalWebViewController:(BOOL) animated {
      // Create webViewController here.
      [self presentModalViewController:webViewController animated:animated];
      self.modalWebViewPresented = YES;
  }
  - (void) dismissModalWebViewController:(BOOL) animated {
      self.modalWebViewPresented = NO;
      [self dismissModalViewControllerAnimated:animated];
  }
  - (void) viewDidAppear:(BOOL)animated {
      [super viewDidAppear:animated];
      if (self.modalWebViewPresented) {
           // Note: iOS thinks the previous modal view controller is displayed.
           // It must be dismissed first before a new one can be displayed.  
           // No animation is needed as the YouTube plugin already provides some.
           [self dismissModalWebViewController:NO];
           [self presentModalWebViewController:NO];
      }
  }

这个线程非常有用,帮助我找到问题!

lambmj的答案很好,但我找到了一个更好的方法。在呈现视图控制器中:

  - (void)viewDidAppear:(BOOL)animated {
      [super viewDidAppear:animated];
      if (self.presentedViewController) {
          UIViewController *vc = self.presentedViewController;
          [vc dismissModalViewControllerAnimated:NO];
          [self presentModalViewController:vc
                                  animated:NO];
      }
  }

希望这对你有帮助!

@Gdx Wu@lambmj

谢谢你的方法,它们工作得很好。但有一些小问题,点击完成按钮后&直接跳转到呈现视图控制器,我们需要解散呈现的模态视图控制器并再次呈现它,这会在这些视图控制器切换之间带来一些抖动(如闪光)。

基于此,我强烈推荐@IsaacCisneros的方法,它可以无缝切换。

当UIWebView进入全屏时直接移除;当它退出全屏时添加回UIWebView。下面的示例代码假设一个带有UIWebView子视图的UIViewController,并且你的UIWebView应该有youtube iframe。

- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
// Add observer for "Done" button click
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(playerWillExitFullscreen:)
                                             name:@"UIMoviePlayerControllerWillExitFullscreenNotification"
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(playerDidEnterFullscreen:)
                                             name:@"UIMoviePlayerControllerDidEnterFullscreenNotification"
                                           object:nil];
}
- (void)viewDidDisappear:(BOOL)animated {
// Remove observers for "Done" button click
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIMoviePlayerControllerWillExitFullscreenNotification" object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil];
}
- (void)playerWillExitFullscreen:(NSNotification *)notification {
// Before exit full screen, add back UIWebView that have been removed earlier
[self.view addSubview:self.webView];
}
- (void)playerDidEnterFullscreen:(NSNotification *)notification {
if (self.presentingViewController) { // UIWebView is presenting the build-in movie player controller
    [self.webView removeFromSuperview]; // Built-in movie player controller is already entering full screen mode
}
}

最新更新