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 全屏模式的唯一方法是收听 UIWindowDidBecomeKeyNotification
和 UIWindowDidResignKeyNotification
并检测我们的 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
}
我有一个视图,我通过以下方式将其设置为视图控制器的输入附件视图:
@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 全屏模式的唯一方法是收听 UIWindowDidBecomeKeyNotification
和 UIWindowDidResignKeyNotification
并检测我们的 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
}