@@ -34,16 +34,20 @@ class WebViewController : ZDViewController {
lazy var statusBarBackgroundView = DDView . init ( )
lazy var statusBarBackgroundView = DDView . init ( )
var showNavBar : Bool
var showNavBar : Bool
// / 需 要 隐 藏 原 生 导 航 栏 的 子 页 面 U R L p a t h 列 表 , 由 W e b V i e w T o o l 按 需 配 置
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,61 @@ 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 { hiddenPath in
// 完 全 匹 配 当 前 p a t h , 或 以 该 p a t h + " / " 开 头 ( 覆 盖 子 页 面 )
let basePath = hiddenPath . hasSuffix ( " / " ) ? String ( hiddenPath . dropLast ( ) ) : hiddenPath
return currentPath = = basePath || currentPath . hasPrefix ( basePath + " / " )
}
}
private func updateNavBarVisibility ( ) {
let hidden = isNavBarHidden ( )
navigationController ? . navigationBar . isHidden = hidden
if showNavBar && ! hidden {
dd_navigationBarBackgroundColor = . hex ( " 2C395F " )
}
// 强 制 触 发 布 局 更 新 , 使 v i e w S a f e A r e a I n s e t s D i d C h a n g e 能 拿 到 正 确 的 s a f e A r e a I n s e t s
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 +479,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 " )
}
}