Swift

Swift 获取 当前 键盘

Posted on 2021-10-26,2 min read

场景是,改变textField弹出键盘的frame


话不多说,直接上代码

    // 点击获取当前屏幕上展示的键盘,没有就置空
    @IBAction func buttonAction(_ sender: Any) {
        keyBoardBackView = getKeyBoard()
    }
    
    // 移动获取到的键盘
    @IBAction func moveAction(_ sender: Any) {
        if keyBoardBackView != nil {
            if var bounds = keyBoardBackView?.bounds {
                bounds.origin.y -= 20;
                keyBoardBackView?.bounds = bounds
            }
        }
    }

    /**
     目前可以肯定的是,UIKeyBoard展示出来的时候,它的结构再不同的iOS版本上肯定是不同的,
     我不知道是哪个版本之后,结构才像我现在这么解析的这种,我是一层层看视图找到的,所以要注意2点:
        1. 不同的iOS版本,这个遍历获取keyBoardBackView的 keyPath 问题
        2. 横竖屏问题
     */
    
    func getKeyBoard() -> UIView? {
        // UIApplication.shared.windows iOS15之后改写法了
        let windows = UIApplication.shared.windows
        for window in windows.reversed() {
            let keyBoardWindow:AnyClass? = NSClassFromString("UIRemoteKeyboardWindow")
            if window.isKind(of: keyBoardWindow!) { // 键盘是放在 主window 的同级另一个 window下的
                let keyBoard = getKeyBoardInView(window)
                return keyBoard
            }
        }
        return nil
    }
    
    func getKeyBoardInView(_ view:UIView) -> UIView? {
        for subView in view.subviews {
            let containerView:AnyClass? = NSClassFromString("UIInputSetContainerView")
            let inputSetHostView:AnyClass? = NSClassFromString("UIInputSetHostView")
            if subView.isKind(of: containerView!) { // 键盘Window controll的 的 主View
                return getKeyBoardInView(subView); // 继续往下一层查
            } else if subView.isKind(of: inputSetHostView!) { // 这个View 就是 keyBoard 的 BackView
                print("找到了")
                subView.backgroundColor = UIColor.red
                return subView
            }
        }
        return nil
    }

下一篇: ClashX配置→

loading...