Просмотр исходного кода

initial draft to keep search bar accessory view, when dismissing the keyboard

cyberta 3 лет назад
Родитель
Сommit
f4d3ac83bc

+ 4 - 0
deltachat-ios.xcodeproj/project.pbxproj

@@ -19,6 +19,7 @@
 		30152C9A25A5D92200377714 /* DetectorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3052C60D253F088E007D13EA /* DetectorType.swift */; };
 		30152C9D25A5D95400377714 /* MessageLabelDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3052C609253F082E007D13EA /* MessageLabelDelegate.swift */; };
 		30152CA025A5D97900377714 /* UIEdgeInsets+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305961832346125000C80F33 /* UIEdgeInsets+Extensions.swift */; };
+		3015627028633FD20010A3A8 /* WebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3015626F28633FD20010A3A8 /* WebView.swift */; };
 		3015634423A003BA00E9DEF4 /* AudioRecorderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3015634323A003BA00E9DEF4 /* AudioRecorderController.swift */; };
 		3022E6BE22E8768800763272 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3022E6C022E8768800763272 /* InfoPlist.strings */; };
 		302589FF2452FA280086C1CD /* ShareAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 302589FE2452FA280086C1CD /* ShareAttachment.swift */; };
@@ -245,6 +246,7 @@
 		3010968826838A040032CBA0 /* VideoInviteCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoInviteCell.swift; sourceTree = "<group>"; };
 		3011E8042787365D00214221 /* KeychainManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = KeychainManager.swift; path = ../../DcCore/DcCore/Helper/KeychainManager.swift; sourceTree = "<group>"; };
 		30149D9222F21129003C12B5 /* QrViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QrViewController.swift; sourceTree = "<group>"; };
+		3015626F28633FD20010A3A8 /* WebView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebView.swift; sourceTree = "<group>"; };
 		3015634323A003BA00E9DEF4 /* AudioRecorderController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecorderController.swift; sourceTree = "<group>"; };
 		3022E6BF22E8768800763272 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		3022E6C122E8768C00763272 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = "<group>"; };
@@ -1003,6 +1005,7 @@
 				30F4BFED252E3E020006B9B3 /* PaddingTextView.swift */,
 				305DDD8625DD97BF00974489 /* DynamicFontButton.swift */,
 				30F4E2932859213300ACA0D8 /* ChatListEditingBar.swift */,
+				3015626F28633FD20010A3A8 /* WebView.swift */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -1437,6 +1440,7 @@
 				7AE0A5491FC42F65005ECB4B /* NewChatViewController.swift in Sources */,
 				AE77838F23E4276D0093EABD /* ContactCellViewModel.swift in Sources */,
 				B20462E62440C99600367A57 /* SettingsAutodelSetController.swift in Sources */,
+				3015627028633FD20010A3A8 /* WebView.swift in Sources */,
 				3015634423A003BA00E9DEF4 /* AudioRecorderController.swift in Sources */,
 				30F4E2942859213400ACA0D8 /* ChatListEditingBar.swift in Sources */,
 				AE57C0802552BBD0003CFE70 /* GalleryItem.swift in Sources */,

+ 36 - 2
deltachat-ios/Assets/search.js

@@ -74,8 +74,43 @@ function WKWebView_jump(increment){
 function WKWebView_HighlightAllOccurencesOfString(keyword) {
     WKWebView_RemoveAllHighlights();
     WKWebView_HighlightAllOccurencesOfStringForElement(document.body, keyword.toLowerCase());
+    WKWebView_HandleFocus();
+}
+
+// ensures the webview can become the first reponder by adding a hidden contentEditable div
+function WKWebView_HandleFocus() {
+    var searchFocusDiv = document.getElementById("WKWebView_SearchFocus");
     if (WKWebView_SearchResultCount > 0) {
-        WKWebView_SearchNext()
+        if (searchFocusDiv == null) {
+            searchFocusDiv = document.createElement("div");
+            searchFocusDiv.setAttribute("contenteditable", "true");
+            searchFocusDiv.id="WKWebView_SearchFocus";
+            searchFocusDiv.style.height = "0";
+            searchFocusDiv.style.width = "0";
+            searchFocusDiv.style.overflow = "hidden";
+            searchFocusDiv.style.outline = "0px solid transparent";
+            document.body.appendChild(searchFocusDiv);
+        }
+        WKWebView_SearchNext();
+    } /*else {
+        if (searchFocusDiv != null) {
+            searchFocusDiv.parentNode.removeChild(searchFocusDiv);
+        }
+    }*/
+}
+
+function WKWebview_Focus() {
+    console.log("WKWebview_Focus_WebView");
+    document.getElementById("WKWebView_SearchFocus").focus();
+    var el = document.getElementsByClassName("WKWebView_Highlight")[WKWebView_CurrentlySelected];
+    el.scrollIntoView(true);
+}
+
+function WKWebview_ResignFocus() {
+    console.log("WKWebview_Focus_WebView");
+    var searchFocusDiv = document.getElementById("WKWebView_SearchFocus");
+    if (searchFocusDiv != null) {
+        searchFocusDiv.parentNode.removeChild(searchFocusDiv);
     }
 }
 
@@ -120,6 +155,5 @@ function WKWebView_isElementVisible(element) {
     style.opacity > "0" &&
     style.display !=='none' &&
     style.visibility !== 'hidden';
-    console.log("isElementVisible: ", element, isvisible);
     return isvisible;
 }

+ 36 - 3
deltachat-ios/Controller/WebViewViewController.swift

@@ -3,9 +3,10 @@ import WebKit
 
 class WebViewViewController: UIViewController, WKNavigationDelegate {
 
-    public lazy var webView: WKWebView = {
-        let view = WKWebView(frame: .zero, configuration: configuration)
+    public lazy var webView: WebView = {
+        let view = WebView(frame: .zero, configuration: configuration)
         view.navigationDelegate = self
+        view.searchAccessoryBar = accessoryViewContainer
         return view
     }()
 
@@ -147,6 +148,31 @@ class WebViewViewController: UIViewController, WKNavigationDelegate {
             }
         })
     }
+    
+    private func focusWebView() {
+        // search function
+        let focus = "WKWebview_Focus()"
+        // perform search
+        webView.evaluateJavaScript(focus, completionHandler: { [weak self] _, error in
+            if let error = error {
+                logger.error(error)
+            } else {
+                self?.webView.becomeFirstResponder()
+            }
+        })
+    }
+    
+    private func resignWebViewFocus() {
+        // search function
+        let resignFocus = "WKWebview_ResignFocus()"
+        // perform search
+        webView.evaluateJavaScript(resignFocus, completionHandler: { [weak self] _, error in
+            if let error = error {
+                logger.error(error)
+            }
+            self?.webView.resignFirstResponder()
+        })
+    }
 
     private func updateAccessoryBar() {
         handleSearchResultCount { [weak self] result in
@@ -210,10 +236,17 @@ extension WebViewViewController: UISearchBarDelegate, UISearchControllerDelegate
     func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
         let text = searchController.searchBar.text ?? ""
         self.find(text: text)
+        focusWebView()
     }
 
     func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
-        self.removeAllHighlights()
+        removeAllHighlights()
+        resignWebViewFocus()
+    }
+
+    func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
+        logger.debug("searchBarTextDidEndEditing -> webView.becomeFirstResponder()")
+        focusWebView()
     }
 
     func willPresentSearchController(_ searchController: UISearchController) {

+ 19 - 0
deltachat-ios/View/WebView.swift

@@ -0,0 +1,19 @@
+import Foundation
+import UIKit
+import WebKit
+
+public class WebView: WKWebView {
+    
+    weak var searchAccessoryBar: InputBarAccessoryView?
+    
+    public override var inputAccessoryView: UIView? {
+        logger.debug("return searchAccessoryBar")
+        return searchAccessoryBar
+    }
+    
+    public override var canBecomeFirstResponder: Bool {
+        logger.debug("I can become a first responder!")
+        return true
+    }
+        
+}