From 19e8e11139ddb3aea31a0a33d315ea537bfe4af3 Mon Sep 17 00:00:00 2001 From: jahorton Date: Mon, 6 Apr 2020 09:00:51 +0700 Subject: [PATCH] fix(ios): prevents in-app keyboard resets --- .../Classes/KeymanWebViewController.swift | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/ios/engine/KMEI/KeymanEngine/Classes/KeymanWebViewController.swift b/ios/engine/KMEI/KeymanEngine/Classes/KeymanWebViewController.swift index 19ba8baf31..01b918230b 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/KeymanWebViewController.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/KeymanWebViewController.swift @@ -15,6 +15,22 @@ private let keyboardChangeHelpText = "Tap here to change keyboard" private let subKeyColor = Colors.popupKey private let subKeyColorHighlighted = Colors.popupKeyHighlighted +// We subclass for one critical reason - by default, WebViews may become first responder... +// a detail that is really, REALLY bad for a WebView in a keyboard. +// +// Minor reference here: https://stackoverflow.com/questions/39829863/can-a-uiwebview-handle-user-interaction-without-becoming-first-responder +// +// Confirmed issue existed within app during workaround for https://github.com/keymanapp/keyman/issues/2716 +class KeymanWebView: WKWebView { + override public var canBecomeFirstResponder: Bool { + return false; + } + + override public func becomeFirstResponder() -> Bool { + return false; + } +} + // MARK: - UIViewController class KeymanWebViewController: UIViewController { let storage: Storage @@ -22,7 +38,7 @@ class KeymanWebViewController: UIViewController { private var useSpecialFont = false // Views - var webView: WKWebView? + var webView: KeymanWebView? var activeModel: Bool = false private var helpBubbleView: PopoverView? private var keyPreviewView: KeyPreviewView? @@ -101,7 +117,7 @@ class KeymanWebViewController: UIViewController { userContentController.add(self, name: "keyman") config.userContentController = userContentController - webView = WKWebView(frame: CGRect(origin: .zero, size: keyboardSize), configuration: config) + webView = KeymanWebView(frame: CGRect(origin: .zero, size: keyboardSize), configuration: config) webView!.isOpaque = false webView!.translatesAutoresizingMaskIntoConstraints = false webView!.backgroundColor = UIColor.clear