【问题标题】:Modifying keyboard toolbar / accessory view with WKWebView使用 WKWebView 修改键盘工具栏/附件视图
【发布时间】:2018-08-05 07:08:11
【问题描述】:

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

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

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

确实,我很确定我可以通过对键盘视图层次结构进行手术来实现它……但这似乎是一种乏味而脆弱的方法。

有没有更好的办法?

谢谢!

【问题讨论】:

  • 你尝试了什么?您是否尝试定义自己的输入附件视图?
  • 不幸的是 WKWebView 没有公开输入附件视图,我在网上找到的一些解决方法似乎没有任何作用。
  • 我认为这很有可能。我在一个名为 IQKeyboardManager 的库中看到了这一点。它显示箭头按钮和完成按钮以隐藏键盘。也许你可以检查代码。 github.com/hackiftekhar/IQKeyboardManager
  • 谢谢@Rishabh。不幸的是,我认为 IQKeyboardManager 在这种情况下不会有帮助:(a)它设计用于处理文本字段和文本视图,但不适用于 Web 视图;并且 (b) 它在键盘上方放置一个栏,而不是替换或修改键盘自己的栏(所以你得到两个堆叠的栏)。

标签: ios swift keyboard wkwebview inputaccessoryview


【解决方案1】:

也许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)]
    }

}

它会给出这样的结果:

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

【讨论】:

    【解决方案2】:

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

    详情:

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

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

    此外,在 iOS 13+ 中,您可以覆盖 inputAccessoryView。您应该能够替换它以在 iPad 上提供您自己的。更多细节在这里:https://stackoverflow.com/a/58001395/344591

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多