UIWebView 中的全屏视频干扰了 UIViewController 的输入附件视图

Posted

技术标签:

【中文标题】UIWebView 中的全屏视频干扰了 UIViewController 的输入附件视图【英文标题】:Fullscreen video in UIWebView interferes with UIViewController's input accessory view 【发布时间】:2015-05-28 16:44:12 【问题描述】:

我有一个视图,我通过以下方式将其设置为视图控制器的输入附件视图:

@IBOutlet private weak var bottomPane: UIView!

override func canBecomeFirstResponder() -> Bool 
    return true


override var inputAccessoryView: UIView 
    return bottomPane

一切正常,直到我尝试以全屏模式观看 YouTube 视频(视频加载到 UIWebView)。当视频进入全屏模式时,键盘和我的输入附件视图会消失(我猜这很正常),但是当我退出全屏模式时,它们不会出现。如果我保留对bottomPaneweak 的引用,它将变为nil 并且应用程序崩溃,如果我将其更改为strong,则输入附件视图将保持隐藏状态,直到下次出现键盘。

谁能解释发生了什么以及如何解决这个问题?

【问题讨论】:

【参考方案1】:

这是发生了什么。

当用户与UIWebView 交互时,它成为第一响应者,视图控制器提供的inputAccessoryView 消失(不知道为什么这种情况下的行为与UITextField 不同)。子类化 UIWebView 并覆盖 inputAccessoryView 属性不起作用(永远不会被调用)。所以我阻止与UIWebView 的交互,直到用户加载视频。

private func displayVideo(URL: String)         
    if let video = Video(videoURL: URL) 
        // load video in webView 
        webView.userInteractionEnabled = true
     else 
        webView.userInteractionEnabled = false
    

当用户加载视频时,检测用户进入/退出全屏模式的唯一方法是监听UIWindowDidBecomeKeyNotificationUIWindowDidResignKeyNotification 并检测我们的窗口何时丢失/获得关键状态:

//in view controller:
private func windowDidBecomeKey(notification: NSNotification!) 
    let isCurrentWindow = (notification.object as! UIWindow) == view.window

    if isCurrentWindow 
        // this restores our inputAccessoryView
        becomeFirstResponder()
    


private func windowDidResignKey(notification: NSNotification!) 
    let isCurrentWindow = (notification.object as! UIWindow) == view.window

    if isCurrentWindow 
        // this hides our inputAccessoryView so that it does not obscure video
        resignFirstResponder()
    

当然,由于inputAccessoryView 可以在某些时候被删除,我们应该在需要时重新创建它:

//in view controller:
override var inputAccessoryView: UIView 
    if view == nil 
        // load view here
    

    return view

【讨论】:

以上是关于UIWebView 中的全屏视频干扰了 UIViewController 的输入附件视图的主要内容,如果未能解决你的问题,请参考以下文章

android 6中的android webview youtube视频中的全屏模式问题

iOS 9 UIWebview 嵌入式视频全屏播放导致约束错误

有关videojs的StatusBar问题在离子2中的全屏

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

带封面图片的全屏背景 HTML5 视频

我可以在 UIWebView 内联(不是全屏)中播放 youtube 视频吗?