使用WKWebView修改键盘工具栏/附件视图

时间:2018-02-25 20:28:56

标签: ios swift keyboard wkwebview inputaccessoryview

我使用带有内容可编辑div的WKWebView作为富文本编辑器的核心,并希望修改键盘上方的顶部工具栏 - 包含自动更正建议和格式设置按钮的工具栏。 (不确定这是否算作输入附件视图)。

我发现了一些帖子显示了如何移除条形图,但它们似乎都不起作用,理想情况下我还是要保留自动更正部分。

至少有一个应用程序,尤利西斯,这样做(虽然我不知道它是否带有网络视图):

Ulysses

事实上,我非常确定我可以通过在键盘视图层次上进行手术来实现它......但这似乎是一种乏味而脆弱的方法。

有更好的方法吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

UITextInputAssistantItem上的this tutorial可能会有所帮助。

那就是说,经过一段时间的摆弄,使用WKWebView我仍然只能在键盘显示的第一次工作,并且每次之后它将返回到其原始状态。我发现一直有效的唯一方法就是如下:

class ViewController: UIViewController {

    @IBOutlet weak private var webView: WKWebView!
    private var contentView: UIView?

    override func viewDidLoad() {
        super.viewDidLoad()
        webView.loadHTMLString("<html><body><div contenteditable='true'></div></body></html>", baseURL: nil)
        for subview in webView.scrollView.subviews {
            if subview.classForCoder.description() == "WKContentView" {
                contentView = subview
            }
        }
        inputAssistantItem.leadingBarButtonGroups = [UIBarButtonItemGroup(barButtonItems: [UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(donePressed(_:)))], representativeItem: nil)]
        inputAssistantItem.trailingBarButtonGroups = [UIBarButtonItemGroup(barButtonItems: [UIBarButtonItem(barButtonSystemItem: .camera, target: self, action: #selector(openCamera(_:))), UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(actionPressed(_:)))], representativeItem: nil)]
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow), name: .UIKeyboardDidShow, object: nil)
    }

    @objc private func donePressed(_ sender: UIBarButtonItem) {
        view.endEditing(true)
    }

    @objc private func openCamera(_ sender: UIBarButtonItem) {
        print("camera pressed")
    }

    @objc private func actionPressed(_ sender: UIBarButtonItem) {
        print("action pressed")
    }

    @objc private func keyboardDidShow() {
        contentView?.inputAssistantItem.leadingBarButtonGroups = [UIBarButtonItemGroup(barButtonItems: [UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(donePressed(_:)))], representativeItem: nil)]
        contentView?.inputAssistantItem.trailingBarButtonGroups = [UIBarButtonItemGroup(barButtonItems: [UIBarButtonItem(barButtonSystemItem: .camera, target: self, action: #selector(openCamera(_:))), UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(actionPressed(_:)))], representativeItem: nil)]
    }

}

这将是这样的:

enter image description here

每次键盘显示以及视图控制器本身都必须在内容视图上设置它有点令人沮丧,我希望有更好的方法来做到这一点....但不幸的是我不能找到它。

答案 1 :(得分:0)

也许具有相同行为的更稳定(面向未来)的方法是将 input附件视图放在WKWebView.superview中,然后使用对键盘事件的响应来显示藏起来这是制作输入附件视图的老式方法。

详细信息:

  1. 观察键盘显示/隐藏通知
  2. 输入附件视图放入WKWebView.superview
  3. 在键盘上显示:将输入附件视图放在键盘上方
  4. 关于键盘隐藏:使用键盘将其隐藏

也许很明显,使用delegationWKWebView和您的UIViewController/UIView子类之间传递动作事件。

此外,在iOS 13以上版本中,您可以覆盖inputAccessoryView。您应该可以替换它以在iPad上提供您自己的。此处有更多详细信息:https://stackoverflow.com/a/58001395/344591