如何编辑从WKWebView显示的键盘附件视图?

时间:2018-08-14 08:29:56

标签: ios swift

我正在我的Swift应用程序中使用WKWebView来显示一些文本字段。

我设置了一些外观属性以匹配特定的设计,在这种情况下,其背景必须为蓝色。 但是,当键盘由WKWebView触发时,它会使用外观属性执行某些操作,并以淡淡的我的颜色显示键盘工具栏,您知道为什么吗?

在UIToolBar上唯一起作用的外观操纵是这个:

    UIToolbar.appearance().backgroundColor = .blue

这是我的问题: Pale thing

这是我的目标: Goal keyboard

2 个答案:

答案 0 :(得分:1)

找到了一种方法,最终使UIToolbars陷入混乱。希望一切都在那里,但是您会得到一个主意。斯威夫特4:

class YourController: UIViewController {

    @IBOutlet weak var webView: PWebView!
    var toolbar : UIToolbar?

    func viewDidLoad() {
        webView.addInputAccessoryView(toolbar: self.getToolbar(height: 44))
    }

    func getToolbar(height: Int) -> UIToolbar? {
        let toolBar = UIToolbar()
        toolBar.frame = CGRect(x: 0, y: 50, width: 320, height: height)
        toolBar.barStyle = .black
        toolBar.tintColor = .white
        toolBar.barTintColor = UIColor.blue

        let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(onToolbarDoneClick(sender:)) )
        let flexibleSpaceItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil )

        toolBar.setItems([flexibleSpaceItem, doneButton], animated: false)
        toolBar.isUserInteractionEnabled = true

        toolBar.sizeToFit()
        return toolBar
    }

    @objc func onToolbarDoneClick(sender: UIBarButtonItem) {
        webView?.resignFirstResponder()
    }
}


var ToolbarHandle: UInt8 = 0

extension WKWebView {

    func addInputAccessoryView(toolbar: UIView?) {
        guard let toolbar = toolbar else {return}
        objc_setAssociatedObject(self, &ToolbarHandle, toolbar, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)

        var candidateView: UIView? = nil
        for view in self.scrollView.subviews {
            let description : String = String(describing: type(of: view))
            if description.hasPrefix("WKContent") {
                candidateView = view
                break
            }
        }
        guard let targetView = candidateView else {return}
        let newClass: AnyClass? = classWithCustomAccessoryView(targetView: targetView)

        guard let targetNewClass = newClass else {return}

        object_setClass(targetView, targetNewClass)
    }

    func classWithCustomAccessoryView(targetView: UIView) -> AnyClass? {
        guard let _ = targetView.superclass else {return nil}
        let customInputAccesoryViewClassName = "_CustomInputAccessoryView"             

        var newClass: AnyClass? = NSClassFromString(customInputAccesoryViewClassName)
        if newClass == nil {
            newClass = objc_allocateClassPair(object_getClass(targetView), customInputAccesoryViewClassName, 0)
        } else {
            return newClass
        }

        let newMethod = class_getInstanceMethod(WKWebView.self, #selector(WKWebView.getCustomInputAccessoryView))
        class_addMethod(newClass.self, #selector(getter: WKWebView.inputAccessoryView), method_getImplementation(newMethod!), method_getTypeEncoding(newMethod!))

        objc_registerClassPair(newClass!)

        return newClass
    }

    @objc func getCustomInputAccessoryView() -> UIView? {
        var superWebView: UIView? = self
        while (superWebView != nil) && !(superWebView is WKWebView) {
            superWebView = superWebView?.superview
        }

        guard let webView = superWebView else {return nil}

        let customInputAccessory = objc_getAssociatedObject(webView, &ToolbarHandle)
        return customInputAccessory as? UIView
    }
}

答案 1 :(得分:0)

private var keyBordView: UIView?


override func viewDidLoad() {
    super.viewDidLoad()


    let webView = WKWebView.init(frame: view.bounds)
    webView.loadHTMLString("<html><body><div contenteditable='true'></div></body></html>", baseURL: nil)
    view.addSubview(webView)
    for subview in webView.scrollView.subviews {
        if subview.classForCoder.description() == "WKContentView" {
            keyBordView = subview
        }
    }

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardShow), name: .UIKeyboardDidShow, object: nil)

    // Do any additional setup after loading the view.
}


@objc private func keyboardShow() {

    let keyboardToolbar = UIToolbar()
    keyboardToolbar.backgroundColor = UIColor.blue
    keyboardToolbar.sizeToFit()
    let flexBarButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    let doneBarButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.dismissKeyBord))
    keyboardToolbar.items = [flexBarButton, doneBarButton]
    keyBordView = keyboardToolbar
}