ios - 使用 WKWebView 修改键盘工具栏/附件 View

标签 ios swift keyboard wkwebview inputaccessoryview

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

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

至少有一个应用程序 Ulysses 可以做到这一点(虽然我不知道它是否具有 WebView ):

Ulysses

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

有没有更好的办法?

谢谢!

最佳答案

也许 this tutorialUITextInputAssistantItem 上会有帮助。

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

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

关于ios - 使用 WKWebView 修改键盘工具栏/附件 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48978134/

相关文章:

ios - 如何摆脱有关 View 相互叠加的通知?

ios - iOS 上的 NSCollectionView

ios - 获取当前事件的键盘语言作为 NSLocale

ios - 在 Swift 中将 12 小时 UTC 日期转换为 24 小时本地时区格式

.net - System.Windows.Forms.Keys枚举中的 “OEM”键是什么?

java - 如何监听键盘输入?比如方向键?

ios - dispatch_barrier_async 不等待 CoreImage 完成处理

ios - 与 Java Netty 类似,在 SwiftNIO 中添加多个 channel 管道处理程序

javascript - Vue.js @keydown 获取按下的键

ios - 为什么我的雪没有落到地上?