我试图在SwiftUI
上进行键盘扩展。我的键盘经常使用手势。但是,位于屏幕底部附近的按键向上的手势将被识别为系统手势。就像说的那样here我尝试使用preferredScreenEdgesDeferringSystemGestures
的UIInputViewController
参数,但没有帮助。
这是我的代码:
class MyController<Content: View>: UIHostingController<Content>{
open override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge{
return [.bottom]
}
}
class KeyboardViewController: UIInputViewController {
@IBOutlet var nextKeyboardButton: UIButton!
let device = Device()
override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge{
return [.bottom]
}
override func updateViewConstraints() {
super.updateViewConstraints()
}
override func viewDidLoad() {
super.viewDidLoad()
let setting = KeyboardSettings.Default
let swiftUIView = SwiftUIContainer(inputObjectDelegate: self, setting: setting)
let child = MyController(rootView: swiftUIView.environmentObject(device))
child.setNeedsUpdateOfScreenEdgesDeferringSystemGestures()
child.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(child.view)
addChild(child)
let heightConstraint = NSLayoutConstraint(item: view, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: CGFloat(setting.height))
view.addConstraint(heightConstraint)
setNeedsUpdateOfScreenEdgesDeferringSystemGestures()
}
}
我都尝试过,将UIHostingController
覆盖为子类,并覆盖UIInputViewController
。没什么帮助。键盘是否可以禁用系统底部屏幕边缘手势?
尝试更新。查看内联评论。
class KeyboardViewController: UIInputViewController {
@IBOutlet var nextKeyboardButton: UIButton!
let device = Device()
override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge{
return [.bottom]
}
override func updateViewConstraints() {
super.updateViewConstraints()
}
override func viewDidLoad() {
super.viewDidLoad()
let setting = KeyboardSettings.Default
let swiftUIView = SwiftUIContainer(inputObjectDelegate: self, setting: setting)
let child = MyController(rootView: swiftUIView.environmentObject(device))
child.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(child.view)
addChild(child)
let heightConstraint = NSLayoutConstraint(item: view, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: CGFloat(setting.height))
view.addConstraint(heightConstraint)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
setNeedsUpdateOfScreenEdgesDeferringSystemGestures() // better to call it here
}
// required if child controller used
override var childForScreenEdgesDeferringSystemGestures: UIViewController? {
return self.children.first // should be MyController, or provide explicitly
}
}