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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用WKWebView修改键盘工具栏/附件视图相关的知识,希望对你有一定的参考价值。

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

我发现了一些帖子显示了如何删除栏,但它们似乎都没有工作,理想情况下我还是要保留自动更正部分。

至少有一个应用程序Ulysses这样做(虽然我不知道它是否带有Web视图):

Ulysses

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

有没有更好的办法?

谢谢!

答案

也许this tutorial上的UITextInputAssistantItem会有所帮助。

也就是说,在摆弄了一段时间之后,使用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

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

以上是关于使用WKWebView修改键盘工具栏/附件视图的主要内容,如果未能解决你的问题,请参考以下文章

自定义键盘附件视图输入

防止由键盘输入附件视图引起的表格视图动画

设置 UIKeyboard 附件视图时遇到问题

iOS 11 键盘和附件视图之间的额外空间

swift 键盘粘贴到文本字段使用输入附件视图

iPhone - 向键盘现有附件视图添加一个按钮(来自 UIWebView 的键盘)