ios - 如何编辑 WKWebView 显示的键盘附件 View ?

标签 ios swift

我在 Swift 应用程序中使用 WKWebView 来呈现一些文本字段。

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

UIToolBar 上唯一有效的外观操作是这个:

    UIToolbar.appearance().backgroundColor = .blue

这是我的问题: Pale thing

这是我的目标: Goal keyboard

最佳答案

找到了一种方法,最终混合了 UIToolbars。希望一切都在那里,但你会得到一个想法。 swift 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
    }
}

关于ios - 如何编辑 WKWebView 显示的键盘附件 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51837022/

相关文章:

ios - 从 searchController 解散后如何隐藏导航栏

ios - UINavigationBar 在屏幕截图中显示为灰色

ios - 没有订阅微软 azure 是否有可能获得 office 365 的访问 token ?-swift

ios - 是否可以从 NSFetchedResultsController 获取最新的快照

ios - 如何在 Swift 中创建一组委托(delegate)协议(protocol)项?

ios - 在快速关闭中返回 Void 和 () 之间的区别

ios - 使用 UIActivityViewController 和 UIActivityItemProvider 分享 PDF

ios - UIButton 在运行时出现不同

ios - 如何在没有苹果开发者帐户的情况下降级 Xcode?

ios - 如何在每个 View 中显示文本的页面控件