在 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 后面播放全屏版本