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

Posted

技术标签:

【中文标题】iPad SDK:嵌入式 YouTube 电影在 UIWebView 后面播放全屏版本【英文标题】:iPad SDK: Embedded YouTube movie plays fullscreen version behind UIWebView 【发布时间】:2011-05-14 07:59:11 【问题描述】:

我在 UIScrollView 中有一个 UIWebview。在 webview 中,我有一个嵌入的 YouTube 电影。当我播放 YouTube 电影时,一切正常,但是,当我按下全屏按钮时,电影开始在 web 视图后面播放。将 WebView 放在最前面是行不通的,因为我希望 ScrollView 的滚动功能能够进行水平滚动。

【问题讨论】:

为什么在滚动视图中有一个 webview? UIWebView 实现自己的滚动行为。另外,根据您连接代表的方式,您可能会在 UIWebView 和 UIScrollView 都实现的UIScrollViewDelegate 中获得奇怪的行为。因此,如果你告诉滚动视图和 webview 它的委托属性应该指向你自己(你的控制器),那么每次 webview 滚动时,它都会触发像 scrollViewDidScroll: 这样的方法,这将与你触发时触发的方法相同。滚动视图滚动而不是 webview。对我来说似乎很讨厌。 我想要实现的是我可以水平滚动不同的网页视图(每个网页视图都是杂志页面)。 webviews 的滚动行为被禁用。那么有没有办法更好地做到这一点,或者您能告诉我如何将 YouTube 电影放到前台吗? 【参考方案1】:

基本上,您希望能够检测电影何时开始全屏播放并适当地安排您的视图。然后,当全屏播放结束时,您希望能够将视图恢复到原来的样子。

问题是没有记录的方法来挂钩或检测 UIWebView 何时触发全屏视频播放。

我说的是“记录方式”,因为您可以使用一些通知来检测 UIWebView 何时触发全屏播放。你可以只听他们的意见,并相应地重新排列你的观点。但是,我不一定推荐这样做,因为它们没有记录并且可能会更改(事实上,在 ios 4.3 之前它们都有拼写错误,请参阅下面的答案)。

// For iOS 4.3 and above:
UIMoviePlayerControllerDidEnterFullscreenNotification
UIMoviePlayerControllerDidExitFullscreenNotification   

// For iOS 4.2 and below:
UIMoviePlayerControllerDidEnterFullcreenNotification
UIMoviePlayerControllerDidExitFullcreenNotification   // (note spelling mistake)

发现这些有点痛苦 - 实际上,当 UIWebView 中的 YouTube 视频被播放时,还会触发更多通知。要找到它们,您需要在所有通知的发布上放置一个断点,然后手动检查这些通知的内存位置以找出它们的字符串名称。我实际上认为以前没有人把这些东西拿出来过,因为当我用谷歌搜索它们时,我什么也得不到。但它们确实有效,保证!

我希望能够在进入/退出全屏播放时收到通知会有所帮助,但需要注意的是,Apple 可以随时更改这种未记录的行为。您的应用程序不会因为使用它们而被彻底拒绝(因为您没有调用任何未记录的方法),而且我已经在发布应用程序时使用了它。但这仍然不是世界上最好的主意……但可能是您唯一的选择。

编辑:澄清一下,根据下面的评论:它们不是常量,因此如果您注册了通知,则需要将它们放在引号中。

【讨论】:

我必须#import 什么才能让它们工作?我正在使用 Xcode 4,但出现构建错误(使用未声明的标识符) 您需要将它们放在引号中,它们不是常量,如下所示:addObserver:self selector:@selector(someSelector) name:@"UIMoviePlayerControllerDidEnterFullcreenNotification" object:nil] - 希望对您有所帮助! Bernado 取得了不错的成绩 - 在 4.3 中,通知名称已更改,现在拼写正确。【参考方案2】:

对于 iOS 4.3+,Apple 更改了这些通知的名称: UIMoviePlayerControllerDidEnterFullcreenNotification 现在是 UIMoviePlayerControllerDidEnterFullscreenNotification

UIMoviePlayerControllerDidExitFullcreenNotification 现在是 UIMoviePlayerControllerDidExitFullscreenNotification

请注意:“全屏”一词已更改为“全屏”。

谢谢!

【讨论】:

很好地发现 - 我已经更新了我的答案以参考您的更正。【参考方案3】:

只是想在玩了一段时间后确认它是否有效。您可以直接访问正在播放视频的视图。这是一种注册通知并拉出相关视图的块方法。

注意:您需要延迟添加子视图和/或访问 Apple 内部子视图以移除导航栏以进行进一步自定义。

[[NSNotificationCenter defaultCenter] 
    addObserverForName:@"UIMoviePlayerControllerDidEnterFullcreenNotification" 
    object:nil 
    queue:nil
    usingBlock:^(NSNotification *note)
          MPMoviePlayerController *theMovieController = [note object];
          UIView *theDestinationVideoView = [[note userInfo] 
          objectForKey:@"UIMoviePlayerControllerFullscreenViewUserInfoKey"];
];

【讨论】:

我没有成功让它工作,块永远不会被触发,这在 4.0 中仍然有效吗? 好的,看来他们已经修复了拼写错误,现在是:UIMoviePlayerControllerDidEnterFullscreenNotification 我可以在 uiwebview 全屏播放视频时以编程方式暂停视频吗?

以上是关于iPad SDK:嵌入式 YouTube 电影在 UIWebView 后面播放全屏版本的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Youtube API (GTLYoutube) 在 iPhone sdk 上搜索视频?

Youtube 嵌入的自动全屏显示

如何在 iPad1 iOS SDK 上以编程方式保存视频

如何摆脱嵌入在 UIWebView 中的 youtube 视频周围的白色边框?

Phonegap / Cordova Youtube 在 iOS 上嵌入视频不起作用

默认情况下,嵌入带有字幕的 Youtube 不起作用