feat: 充电管理子页面隐藏原生导航栏

- WebViewController 支持按 URL path 列表自动隐藏原生导航栏
- 监听 webView.url 变化,兼容 SPA 路由切换
- 通过 viewSafeAreaInsetsDidChange 动态调整 WebView 顶部约束
- WebViewTool 为充电管理配置需要隐藏导航栏的子页面 path
This commit is contained in:
ddisfriend
2026-07-28 17:34:26 +08:00
parent cc30f59ef9
commit bf7123d9f0
2 changed files with 62 additions and 25 deletions
@@ -34,16 +34,20 @@ class WebViewController : ZDViewController {
lazy var statusBarBackgroundView = DDView.init() lazy var statusBarBackgroundView = DDView.init()
var showNavBar : Bool var showNavBar : Bool
/// URL path WebViewTool
var hiddenNavBarURLPaths: [String]?
public var vcTitle : String? public var vcTitle : String?
var url : String? var url : String?
var screenEdgePanGestureRecognizerEnable : Bool var screenEdgePanGestureRecognizerEnable : Bool
public var disappearHandler: (() -> Void)? public var disappearHandler: (() -> Void)?
private let webViewURLKeyPath = "URL"
private let locationManager = CLLocationManager() private let locationManager = CLLocationManager()
private var locationCallback: String? private var locationCallback: String?
public init(showNavBar:Bool = true,title:String?,url:String,screenEdgePanGestureRecognizerEnable:Bool = true) { public init(showNavBar:Bool = true,title:String?,url:String,screenEdgePanGestureRecognizerEnable:Bool = true, hiddenNavBarURLPaths: [String]? = nil) {
self.showNavBar = showNavBar self.showNavBar = showNavBar
self.hiddenNavBarURLPaths = hiddenNavBarURLPaths
self.vcTitle = title self.vcTitle = title
self.url = url self.url = url
self.screenEdgePanGestureRecognizerEnable = screenEdgePanGestureRecognizerEnable self.screenEdgePanGestureRecognizerEnable = screenEdgePanGestureRecognizerEnable
@@ -55,6 +59,7 @@ class WebViewController : ZDViewController {
} }
deinit { deinit {
webView.removeObserver(self, forKeyPath: webViewURLKeyPath)
if disappearHandler != nil { if disappearHandler != nil {
disappearHandler!() disappearHandler!()
} }
@@ -69,6 +74,7 @@ class WebViewController : ZDViewController {
webView.backgroundColor = .white webView.backgroundColor = .white
webView.navigationDelegate = self webView.navigationDelegate = self
webView.uiDelegate = self webView.uiDelegate = self
webView.addObserver(self, forKeyPath: webViewURLKeyPath, options: .new, context: nil)
view.addSubview(webView) view.addSubview(webView)
let request = URLRequest(url: URL(string: url!)!,cachePolicy: .reloadIgnoringLocalAndRemoteCacheData) let request = URLRequest(url: URL(string: url!)!,cachePolicy: .reloadIgnoringLocalAndRemoteCacheData)
@@ -95,33 +101,12 @@ class WebViewController : ZDViewController {
override func viewSafeAreaInsetsDidChange() { override func viewSafeAreaInsetsDidChange() {
super.viewSafeAreaInsetsDidChange() super.viewSafeAreaInsetsDidChange()
if showNavBar == false { updateWebViewConstraints()
statusBarBackgroundView.snp.remakeConstraints { make in
make.top.left.right.equalToSuperview()
make.height.equalTo(view.safeAreaInsets.top)
}
webView.snp.remakeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(statusBarBackgroundView.snp.bottom)
make.bottom.equalTo(-view.safeAreaInsets.bottom)
}
}else{
webView.snp.remakeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(view.safeAreaInsets.top)
make.bottom.equalTo(-view.safeAreaInsets.bottom)
}
}
} }
override func viewWillAppear(_ animated: Bool) { override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated) super.viewWillAppear(animated)
if showNavBar == false { updateNavBarVisibility()
navigationController?.navigationBar.isHidden = true
}else{
dd_navigationBarBackgroundColor = .hex("2C395F")
}
if screenEdgePanGestureRecognizerEnable == false { if screenEdgePanGestureRecognizerEnable == false {
let nav = navigationController as? DDNavigationController let nav = navigationController as? DDNavigationController
nav?.screenEdgePanGestureRecognizerEnable(false) nav?.screenEdgePanGestureRecognizerEnable(false)
@@ -149,6 +134,57 @@ class WebViewController : ZDViewController {
} }
} }
private func isNavBarHidden() -> Bool {
if showNavBar == false { return true }
guard let hiddenPaths = hiddenNavBarURLPaths, let currentUrl = webView.url else { return false }
let currentPath = currentUrl.path
return hiddenPaths.contains(currentPath)
}
private func updateNavBarVisibility() {
let hidden = isNavBarHidden()
navigationController?.navigationBar.isHidden = hidden
if showNavBar && !hidden {
dd_navigationBarBackgroundColor = .hex("2C395F")
}
// 使 viewSafeAreaInsetsDidChange safeAreaInsets
view.setNeedsLayout()
view.layoutIfNeeded()
}
private func updateWebViewConstraints() {
let hidden = isNavBarHidden()
let safeAreaTop = view.safeAreaInsets.top
if showNavBar == false || hidden {
if statusBarBackgroundView.superview == nil {
view.addSubview(statusBarBackgroundView)
}
statusBarBackgroundView.backgroundColor = .hex("2C395F")
statusBarBackgroundView.snp.remakeConstraints { make in
make.top.left.right.equalToSuperview()
make.height.equalTo(safeAreaTop)
}
webView.snp.remakeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(statusBarBackgroundView.snp.bottom)
make.bottom.equalTo(-view.safeAreaInsets.bottom)
}
} else {
webView.snp.remakeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(safeAreaTop)
make.bottom.equalTo(-view.safeAreaInsets.bottom)
}
}
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == webViewURLKeyPath {
updateNavBarVisibility()
}
}
private func addScriptMessageHandlers() { private func addScriptMessageHandlers() {
let handlers = ["nativeObject", "scan", "getLocation", "openMapNavigation", "callPhone", "openDocument"] let handlers = ["nativeObject", "scan", "getLocation", "openMapNavigation", "callPhone", "openDocument"]
handlers.forEach { name in handlers.forEach { name in
@@ -439,6 +475,7 @@ extension WebViewController : WKNavigationDelegate,WKUIDelegate {
public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
view.dd_hideHUD() view.dd_hideHUD()
DDLog(message: "finish--------------------------------\(String(describing: webView.url?.absoluteString))") DDLog(message: "finish--------------------------------\(String(describing: webView.url?.absoluteString))")
updateNavBarVisibility()
if showNavBar == false { if showNavBar == false {
statusBarBackgroundView.backgroundColor = .hex("2C395F") statusBarBackgroundView.backgroundColor = .hex("2C395F")
} }
@@ -170,7 +170,7 @@ open class WebViewTool : NSObject {
vc = WebViewController(showNavBar:false, title: nil, url: "\((h5Models?.managerPeople)!)?token=\((USER.token)!)"+(appending ?? "")) vc = WebViewController(showNavBar:false, title: nil, url: "\((h5Models?.managerPeople)!)?token=\((USER.token)!)"+(appending ?? ""))
break break
case .gjUrl: case .gjUrl:
vc = WebViewController(showNavBar:true, title: nil, url: "\((h5Models?.gjUrl)!)?"+(appending ?? "")) vc = WebViewController(showNavBar:true, title: nil, url: "\((h5Models?.gjUrl)!)?"+(appending ?? ""), hiddenNavBarURLPaths: ["/h5/pages/order/list", "/h5/pages/invoice/list"])
break break
} }