diff --git a/AgileWorks/AgileWorks.xcodeproj/project.pbxproj b/AgileWorks/AgileWorks.xcodeproj/project.pbxproj index a93c4e341aca815a7fb273df7dd466abfb55c0d5..37537f6a748b6c5500c5d3f97f57ec99667e9a35 100644 --- a/AgileWorks/AgileWorks.xcodeproj/project.pbxproj +++ b/AgileWorks/AgileWorks.xcodeproj/project.pbxproj @@ -175,6 +175,7 @@ C50CF79027D870720042C210 /* OpenLicenseViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C50CF78F27D870720042C210 /* OpenLicenseViewController.storyboard */; }; C50CF79227D8708B0042C210 /* OpenLicenseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C50CF79127D8708B0042C210 /* OpenLicenseViewController.swift */; }; C51EF0E92769FA2E00361B38 /* WebViewScriptMessageHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51EF0E82769FA2E00361B38 /* WebViewScriptMessageHandler.swift */; }; + C52221BC27FD67EA00494390 /* SubViewStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52221BB27FD67EA00494390 /* SubViewStack.swift */; }; C5285D3927CCB3C8006A9182 /* ProfileTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5285D3827CCB3C8006A9182 /* ProfileTableViewCell.swift */; }; C535772C2754D12600EAA660 /* WebViewBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = C535772B2754D12600EAA660 /* WebViewBuilder.swift */; }; C535772E2754D5C500EAA660 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C535772D2754D5C500EAA660 /* WebViewController.swift */; }; @@ -379,6 +380,7 @@ C50CF78F27D870720042C210 /* OpenLicenseViewController.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = OpenLicenseViewController.storyboard; sourceTree = ""; }; C50CF79127D8708B0042C210 /* OpenLicenseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenLicenseViewController.swift; sourceTree = ""; }; C51EF0E82769FA2E00361B38 /* WebViewScriptMessageHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewScriptMessageHandler.swift; sourceTree = ""; }; + C52221BB27FD67EA00494390 /* SubViewStack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubViewStack.swift; sourceTree = ""; }; C5285D3827CCB3C8006A9182 /* ProfileTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileTableViewCell.swift; sourceTree = ""; }; C535772B2754D12600EAA660 /* WebViewBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewBuilder.swift; sourceTree = ""; }; C535772D2754D5C500EAA660 /* WebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewController.swift; sourceTree = ""; }; @@ -944,6 +946,14 @@ path = View; sourceTree = ""; }; + C52221BA27FD67C400494390 /* SubView */ = { + isa = PBXGroup; + children = ( + C52221BB27FD67EA00494390 /* SubViewStack.swift */, + ); + path = SubView; + sourceTree = ""; + }; C5285D3727CCB3A1006A9182 /* Cell */ = { isa = PBXGroup; children = ( @@ -972,6 +982,7 @@ C535772A2754D0A200EAA660 /* View */ = { isa = PBXGroup; children = ( + C52221BA27FD67C400494390 /* SubView */, C535772D2754D5C500EAA660 /* WebViewController.swift */, C53577362758AC1100EAA660 /* WebViewController.storyboard */, C51EF0E82769FA2E00361B38 /* WebViewScriptMessageHandler.swift */, @@ -1456,6 +1467,7 @@ 31AA003224347C98000177B4 /* SubmissionResponse.swift in Sources */, BDBBF838243C9EA300EEB25D /* GetApprovalsEndpoint.swift in Sources */, BD7DC0F224C0608800C3FBED /* ErrorResponse.swift in Sources */, + C52221BC27FD67EA00494390 /* SubViewStack.swift in Sources */, 76D1DC152592FC5200429C70 /* DocumentResponse.swift in Sources */, BD7E623F247611CC0089CFA6 /* Navi.swift in Sources */, BD7A8007241A16B90040B418 /* DeepLinkParser.swift in Sources */, diff --git a/AgileWorks/AgileWorks/WebView/View/SubView/SubViewStack.swift b/AgileWorks/AgileWorks/WebView/View/SubView/SubViewStack.swift new file mode 100644 index 0000000000000000000000000000000000000000..2329a0d8a442a4c4a799f680e15c9ce8ec31ad12 --- /dev/null +++ b/AgileWorks/AgileWorks/WebView/View/SubView/SubViewStack.swift @@ -0,0 +1,80 @@ +// +// SubWebViewStack.swift +// AgileWorks +// +// Created by Gk40002148 on 2022/04/06. +// Copyright © 2022 ATLED CORP. All rights reserved. +// + +import Foundation +import UIKit +import WebKit + +protocol SubViewStackEventDelegate : AnyObject { + func onClose(webView: WKWebView, stack: SubViewStack) -> Void; +} + +class SubViewStack: NSObject { + private var webViews = [WKWebView]() + public weak var eventDelegate: SubViewStackEventDelegate? + + public var isEmpty: Bool { + return webViews.isEmpty + } + + func push(_ webView: WKWebView, superView: UIView) { + webViews.append(webView) + webView.uiDelegate = self + webView.allowsBackForwardNavigationGestures = true + + let swipeRightGesture: UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(self.handleRight(sender:))) + swipeRightGesture.numberOfTouchesRequired = 1 + swipeRightGesture.direction = .right + webView.addGestureRecognizer(swipeRightGesture) + superView.addSubview(webView) + } + + func pop() -> WKWebView? { + if webViews.isEmpty { + return nil + } else { + let webView = webViews.removeLast() + cleanup(webView) + return webView + } + } + + func remove(_ webView: WKWebView) -> WKWebView? { + if let index = webViews.firstIndex(of: webView) { + let webView = webViews.remove(at: index) + cleanup(webView) + return webView + } else { + return nil + } + } + + @objc + func handleRight(sender: UITapGestureRecognizer) { + print("Swiped Right!!") + _ = pop() + } + private func cleanup(_ webView: WKWebView) { + webView.removeFromSuperview() + eventDelegate?.onClose(webView: webView, stack: self) + } +} + +extension SubViewStack: WKUIDelegate { + func webViewDidClose(_ webView: WKWebView) { + // スクリプトで閉じられる場合。最上段でなくとも削除される可能性を考慮。 + _ = remove(webView) + } +} + +extension SubViewStack: UIGestureRecognizerDelegate { + // WebViewでのタップイベントを有効化 + func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { + return true + } +} diff --git a/AgileWorks/AgileWorks/WebView/View/WebViewController.swift b/AgileWorks/AgileWorks/WebView/View/WebViewController.swift index 41e1b56b7659d1964d8b54fd4328adbcbf3721da..4127fc2ea4abbd99e6e8b52b3e8e81957b41029f 100644 --- a/AgileWorks/AgileWorks/WebView/View/WebViewController.swift +++ b/AgileWorks/AgileWorks/WebView/View/WebViewController.swift @@ -21,7 +21,7 @@ class WebViewController: UIViewController { // WebView 表示用 JSESSIONID var sessionId: String! // 別ウインドウで開いたときの子ウインドウスタック - var subWebViewStack = SubWebViewStack() + var subViewStack = SubViewStack() var loadURL: String! var naviTitle: String! var showNotification = false @@ -61,7 +61,7 @@ class WebViewController: UIViewController { self.closeButton.isEnabled = false self.menuButton.isEnabled = true } - self.subWebViewStack.eventDelegate = self + self.subViewStack.eventDelegate = self self.updateSession(isInit: true) // ネットワークオフラインView関連セットアップ @@ -351,9 +351,9 @@ extension WebViewController: WKUIDelegate { func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { if navigationAction.targetFrame?.isMainFrame != true { - let webView = WKWebView(frame: view.frame, configuration: configuration) + let webView = WKWebView(frame: self.formView.frame, configuration: configuration) webView.load(navigationAction.request) - subWebViewStack.push(webView, superView: view) + subViewStack.push(webView, superView: view) return webView } return nil @@ -373,8 +373,8 @@ extension WebViewController: WKUIDelegate { extension WebViewController: WKNavigationDelegate { } -extension WebViewController: SubWebViewStackEventDelegate { - func onClose(webView: WKWebView, stack: SubWebViewStack) { +extension WebViewController: SubViewStackEventDelegate { + func onClose(webView: WKWebView, stack: SubViewStack) { if stack.isEmpty { //closeButton.title = localizadStrings(key: "Close", comment: "") } @@ -397,7 +397,17 @@ extension WebViewController: UIScrollViewDelegate { extension WebViewController: UITabBarControllerDelegate { func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { - if loadURL != nowURL { + var viewReload = false + if subViewStack.isEmpty { + if loadURL != nowURL { + viewReload = true + } + } else { + viewReload = true + while subViewStack.pop() != nil { + } + } + if viewReload { setWebView() loadWebView() }