ios - 键盘扩展中的preferredScreenEdgesDeferringSystemGestures不起作用

标签 ios swift swiftui gesture ios-keyboard-extension

我试图在SwiftUI上进行键盘扩展。我的键盘经常使用手势。但是,位于屏幕底部附近的按键向上的手势将被识别为系统手势。就像说here一样,我尝试使用preferredScreenEdgesDeferringSystemGesturesUIInputViewController参数,但这无济于事。

这是我的代码:

导入UIKit
导入SwiftUI
//导入CoreData

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覆盖为子类,并覆盖UIInputViewController。没什么帮助。键盘是否可以禁用系统底部屏幕边缘手势?

现在,它是如何工作的:

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

最佳答案

尝试更新。查看内联评论。

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

关于ios - 键盘扩展中的preferredScreenEdgesDeferringSystemGestures不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61227987/

相关文章:

string - 更改 UIDatePicker 文本颜色

ios - 大型项目的 SwiftUI 预览超时

ios - 向 SwiftUI TextField 添加不可编辑的后缀

ios - swift 用户界面 : Dismiss modal from child view

ios - 是否可以将您的应用程序添加到 iOS 11 控制中心或从锁定屏幕访问?

android - 使用 Cordova 的跨平台菜单

ios - 是否可以在 Swift 上创建常量文件?

iphone - 理解属性访问概念时遇到问题

ios - 无法创建用作带有通配符标识符的 iOS 应用程序配置文件的应用程序包 ID 的显式 AppID

ios - 将 IBOutlet/对象传递到可重复动画的通用函数中