键盘扩展名中的preferredScreenEdgesDeferringSystemGestures不起作用

时间:2020-04-15 11:51:12

标签: ios swift swiftui gesture ios-keyboard-extension

我试图在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。没什么帮助。键盘是否可以禁用系统底部屏幕边缘手势?

这是现在的工作方式:

here is how it works in keyboard extension

这是在全屏应用程序中的工作方式,我希望使用键盘也能做到这一点:

and here is how this works in fullscreen app and I want the same with my keyboard

1 个答案:

答案 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
    }
}