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

Fullscreen video in UIWebView interferes with UIViewController's input accessory view

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

@IBOutlet private weak var bottomPane: UIView!

override func canBecomeFirstResponder() -> Bool {
    return true
}

override var inputAccessoryView: UIView {
    return bottomPane
}

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

任何人都可以解释发生了什么以及如何解决这个问题吗?

这是正在发生的事情。

当用户与 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
    }
}

当用户加载视频时,检测用户是否具有 entered/exited 全屏模式的唯一方法是收听 UIWindowDidBecomeKeyNotificationUIWindowDidResignKeyNotification 并检测我们的 window loses/gains 关键状态:

//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
}