我试图在SwiftUI
上进行键盘扩展。我的键盘经常使用手势。但是,位于屏幕底部附近的按键向上的手势将被识别为系统手势。就像here所说的那样,我尝试使用preferredScreenEdgesDeferringSystemGestures
的{{1}}参数,但这无济于事。
这是我的代码:
导入UIKit 导入SwiftUI //导入CoreData
UIInputViewController
我都尝试过,将struct SwiftUIContainer: View{
@State var dragLocation: CGPoint = .zero
var body: some View{
VStack{
Circle()
.fill(Color.red)
.frame(width: 20, height: 20)
.position(self.dragLocation)
.gesture(DragGesture().onChanged(){value in
self.dragLocation = value.location
}
)
}.background(Color.green)
}
}
class MyController<Content: View>: UIHostingController<Content>{
open override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge{
print("request edges for conteiner")
return [.bottom]
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("set edges for conteiner")
setNeedsUpdateOfScreenEdgesDeferringSystemGestures() // better to call it here
}
}
class KeyboardViewController: UIInputViewController {
@IBOutlet var nextKeyboardButton: UIButton!
var swiftUIConteiner: UIViewController!
override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge{
print("request edges for keyboard")
return [.bottom]
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
let swiftUIView = SwiftUIContainer()
let child = MyController(rootView: swiftUIView)
child.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
self.swiftUIConteiner = child as UIViewController
// child.setNeedsUpdateOfScreenEdgesDeferringSystemGestures()
print("create children for keyboard")
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override func viewDidLoad(){
super.viewDidLoad()
view.addSubview(self.swiftUIConteiner.view)
addChild(self.swiftUIConteiner)
print("insert children for keyboard")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("set edges for keyboard")
setNeedsUpdateOfScreenEdgesDeferringSystemGestures() // better to call it here
}
override var childForScreenEdgesDeferringSystemGestures: UIViewController? {
print("show children for keyboard")
return self.swiftUIConteiner
}
}
作为子类覆盖,并覆盖UIHostingController
。没什么帮助。键盘是否可以禁用系统底部屏幕边缘手势?
这是现在的工作方式:
这是在全屏应用程序中的工作方式,我希望使用键盘也能做到这一点:
答案 0 :(得分:0)
尝试更新。查看内嵌评论。
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
}
}