在 uiwebview 中播放 youtube 视频。如何处理“完成”按钮?

Posted

技术标签:

【中文标题】在 uiwebview 中播放 youtube 视频。如何处理“完成”按钮?【英文标题】:playing youtube video inside uiwebview. How to handle the "done" button? 【发布时间】:2012-01-15 04:34:07 【问题描述】:

我有一个播放 youtube 视频的 uiwebview。如何处理完成按钮操作? 现在,当我点击完成按钮时,它会变回我的应用程序主菜单(而不是应该关闭的菜单)并且它只是冻结。谁能帮帮我?

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

【问题讨论】:

已经找到解决您问题的方法,可以分享给我们吗? 还没有……我还没找到 【参考方案1】:

当 UIWebView 进入全屏时,只需移除它;退出全屏时添加回 UIWebView。下面的示例代码假设 UIViewController 具有 UIWebView 的子视图,并且您的 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


【讨论】:

【参考方案2】:

@Gdx 吴 @lambmj

感谢您的方法,它们工作正常。但是有一个小问题,在单击完成按钮并直接跳转到呈现视图控制器后,我们需要关闭呈现的模态视图控制器并再次呈现它,这会在这些视图控制器切换之间带来一些抖动(如闪光)。

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

【讨论】:

【参考方案3】:

这个帖子很有用,帮我找到问题!

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

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

希望这会有所帮助!

【讨论】:

【参考方案4】:

YouTube 插件播放器本身就是一个模态视图控制器。当按下完成按钮时,它会返回到它的presentingViewController。它的presentingViewController 不是您的模态视图控制器,而是调用[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];
      
  

【讨论】:

此方法仅在您关闭 VIEWDIDAPPEAR 中的 webviewController 时才有效,在我的情况下,如果我在 VIEWWILLAPPEAR 中执行此操作,它会崩溃。小心点。感谢您的提示 效果很好,谢谢。有人知道为什么我们必须首先这样做吗?这是 UIKit 中的一个错误,还是我对模态视图控制器有什么误解? 在这种情况下,UIWebView 以模态方式呈现,而位于其之上的 You Tube 插件也以模态方式呈现。所以我们有一个模态视图控制器,呈现一个模态视图控制器。 UIKit 期望只呈现一个模态视图控制器,并且当顶部的视图控制器被解除时,它下面的那些也被解除。当这种情况发生时,基本视图控制器会被调用 viewDidAppear: 并让我们有机会再次表示我们的模态视图控制器。这是一个错误吗?也许,但很可能这是苹果做出的一个我们必须解决的设计决定。 在 iOS 6 上没有这样的行为。我的应用在 iOS 5 上显示了这种行为,并且在 iOS 6 上正常运行。

以上是关于在 uiwebview 中播放 youtube 视频。如何处理“完成”按钮?的主要内容,如果未能解决你的问题,请参考以下文章

在没有全屏的情况下在 UIWebView 中播放 Youtube 视频

如何在没有 UIWebView 的情况下播放 youtube 视频或在 youtube 视频开始使用 webview 播放时检测视频播放器?

如何从 UIWebView 嵌入式 YouTube 视频播放接收 NSNotifications

iPad SDK:嵌入式 YouTube 电影在 UIWebView 后面播放全屏版本

iOS5:在模态 UIViewController 中播放 Youtube 视频时 UIWebView 出现异常

UIWebView 模态 YouTube 播放器“完成”按钮操作