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
)。当视频进入全屏模式时,键盘和我的输入附件视图会消失(我猜这很正常),但是当我退出全屏模式时,它们不会出现。如果我保留对bottomPane
weak
的引用,它将变为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
当用户加载视频时,检测用户进入/退出全屏模式的唯一方法是监听UIWindowDidBecomeKeyNotification
和UIWindowDidResignKeyNotification
并检测我们的窗口何时丢失/获得关键状态:
//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 嵌入式视频全屏播放导致约束错误