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

时间:2011-12-07 16:50:38

标签: iphone ios video uiwebview youtube

我有一个播放youtube视频的uiwebview。如何处理完成按钮操作? 现在,当我点击完成按钮时,它会更改回我的应用程序主菜单(而不是应该关闭的菜单),它就会冻结。有人可以帮帮我吗?

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

4 个答案:

答案 0 :(得分:8)

YouTube插件播放器本身就是一个模态视图控制器。按下完成按钮后,它将返回presentingViewController。它的presentingViewController不是你的模态视图控制器,而是调用[presentModalViewController:animated:]来显示你的模态视图控制器的viewController。由于原始模态视图控制器仍处于活动状态,因此应用程序表现不佳。

要解决问题,

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];
      }
  }

答案 1 :(得分:2)

这个帖子非常有用,可以帮助我找到问题!

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

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

希望这有帮助!

答案 2 :(得分:0)

@Gdx吴 @lambmj

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

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

答案 3 :(得分:0)

完全进入全屏后,只需删除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
}
}