PQBaseViewController.swift 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. //
  2. // PQBaseViewController.swift
  3. // PQSpeed
  4. //
  5. // Created by SanW on 2020/5/25.
  6. // Copyright © 2020 BytesFlow. All rights reserved.
  7. //
  8. // import MediaPlayer
  9. import Alamofire
  10. import FDFullscreenPopGesture
  11. import UIKit
  12. open class PQBaseViewController: UIViewController, UIGestureRecognizerDelegate {
  13. // 侧滑拦截返回
  14. public var popGestureHandle: (() -> Void)?
  15. public var naviTitle: String? // 标题
  16. public var rightButton: UIButton? // 右边按钮
  17. public var backButton: UIButton? // 左边按钮
  18. public var navTitleLabel: UILabel? // 标题
  19. public var navHeadImageView: UIImageView? // 导航条
  20. public var lineView: UIView? // 导航分隔线
  21. public var isHiddenStatus: Bool = false { // 更新状态栏
  22. didSet {
  23. setNeedsStatusBarAppearanceUpdate()
  24. }
  25. }
  26. /// <#Description#>
  27. public var isPresent: Bool {
  28. var isPresent = true
  29. let viewcontrollers = navigationController?.viewControllers
  30. if (viewcontrollers?.count ?? 0) > 1 {
  31. if viewcontrollers?[(viewcontrollers?.count ?? 1) - 1] == self {
  32. isPresent = false
  33. }
  34. }
  35. return isPresent
  36. }
  37. public lazy var manager: NetworkReachabilityManager? = {
  38. let manager = NetworkReachabilityManager(host: "www.baidu.com")
  39. manager?.startListening(onQueue: DispatchQueue.global(), onUpdatePerforming: { status in
  40. if status == .reachable(.cellular) || status == .reachable(.ethernetOrWiFi) {}
  41. })
  42. return manager
  43. }()
  44. override open func viewDidLoad() {
  45. super.viewDidLoad()
  46. navigationController?.isNavigationBarHidden = true
  47. view.backgroundColor = PQBFConfig.shared.styleBackGroundColor
  48. navHeadImageView = UIImageView(image: UIImage())
  49. navHeadImageView?.isUserInteractionEnabled = true
  50. navHeadImageView?.backgroundColor = PQBFConfig.shared.styleBackGroundColor
  51. navHeadImageView?.frame = CGRect(x: 0, y: 0, width: cScreenWidth, height: cDevice_iPhoneNavBarAndStatusBarHei)
  52. view.addSubview(navHeadImageView!)
  53. lineView = UIView(frame: CGRect(x: 0, y: (navHeadImageView?.frame.maxY ?? cDevice_iPhoneNavBarAndStatusBarHei) - 0.5, width: cScreenWidth, height: 0.5))
  54. lineView?.backgroundColor = PQBFConfig.shared.styleBackGroundColor
  55. view.addSubview(lineView!)
  56. // UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
  57. automaticallyAdjustsScrollViewInsets = false
  58. navigationController?.interactivePopGestureRecognizer?.delegate = self
  59. fd_prefersNavigationBarHidden = true
  60. }
  61. public func hiddenNavigation() {
  62. navHeadImageView?.isHidden = true
  63. lineView?.isHidden = true
  64. }
  65. public func showNavigation() {
  66. if navHeadImageView != nil {
  67. navHeadImageView?.isHidden = false
  68. lineView?.isHidden = false
  69. view.bringSubviewToFront(navHeadImageView!)
  70. }
  71. }
  72. open func leftBackButton(image: UIImage? = nil) {
  73. leftButton(image: image, imageName: "icon_detail_back")
  74. }
  75. public func leftButton(image: UIImage? = nil, imageName: String? = nil, tintColor: UIColor? = nil) {
  76. let leftButton = UIButton(type: .custom)
  77. leftButton.frame = CGRect(x: 0, y: cDevice_iPhoneStatusBarHei, width: cDefaultMargin * 4, height: cDefaultMargin * 4)
  78. leftButton.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: -5, right: 0)
  79. if tintColor != nil {
  80. leftButton.tintColor = tintColor
  81. leftButton.setImage((image ?? UIImage.moduleImage(named: imageName ?? "icon_detail_back", moduleName: "BFCommonKit"))?.withRenderingMode(.alwaysTemplate), for: .normal)
  82. } else {
  83. leftButton.setImage(image ?? UIImage.moduleImage(named: imageName ?? "icon_detail_back", moduleName: "BFCommonKit"), for: .normal)
  84. }
  85. leftButton.addTarget(self, action: #selector(backBtnClick), for: .touchUpInside)
  86. navHeadImageView?.addSubview(leftButton)
  87. backButton = leftButton
  88. }
  89. public func rightButtonItem(image: String?, title: String?) {
  90. let rightButtonItem = UIButton(type: .custom)
  91. var rightW: CGFloat = cDefaultMargin
  92. if title != nil, title?.count ?? 0 > 0 {
  93. rightW = rightW + sizeWithText(text: title ?? "", font: UIFont.systemFont(ofSize: 16), size: CGSize(width: CGFloat.greatestFiniteMagnitude, height: cDefaultMargin * 4)).width
  94. rightButtonItem.setTitle(title, for: .normal)
  95. rightButtonItem.setTitleColor(UIColor.hexColor(hexadecimal: "#242F44"), for: .normal)
  96. rightButtonItem.titleLabel?.font = UIFont.systemFont(ofSize: 16)
  97. }
  98. if image != nil, image?.count ?? 0 > 0 {
  99. rightW = rightW + cDefaultMargin * 4
  100. rightButtonItem.setImage(UIImage(named: image ?? ""), for: .normal)
  101. rightButtonItem.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: (title != nil && title?.count ?? 0 > 0) ? 0 : -5, right: 0)
  102. }
  103. rightButtonItem.adjustsImageWhenHighlighted = false
  104. rightButtonItem.frame = CGRect(x: cScreenWidth - rightW, y: cDevice_iPhoneStatusBarHei, width: rightW, height: cDefaultMargin * 4)
  105. rightButtonItem.addTarget(self, action: #selector(rightBtnClick(sender:)), for: .touchUpInside)
  106. rightButtonItem.contentHorizontalAlignment = .center
  107. navHeadImageView?.addSubview(rightButtonItem)
  108. rightButton = rightButtonItem
  109. }
  110. public func setTitle(title: String?, color: UIColor = UIColor.white) {
  111. naviTitle = title
  112. if navTitleLabel == nil {
  113. let titleLabel = UILabel(frame: CGRect(x: cDefaultMargin * 5, y: cDevice_iPhoneStatusBarHei, width: cScreenWidth - 100, height: cDefaultMargin * 4))
  114. titleLabel.textColor = color
  115. titleLabel.textAlignment = .center
  116. navTitleLabel = titleLabel
  117. navHeadImageView?.addSubview(titleLabel)
  118. }
  119. navTitleLabel?.text = title
  120. }
  121. @objc open func rightBtnClick(sender _: UIButton) {}
  122. @objc open func backBtnClick() {
  123. if isPresent {
  124. dismiss(animated: true, completion: nil)
  125. } else {
  126. navigationController?.popViewController(animated: true)
  127. }
  128. }
  129. override open func viewDidAppear(_ animated: Bool) {
  130. super.viewDidAppear(animated)
  131. }
  132. override open func viewWillDisappear(_ animated: Bool) {
  133. super.viewWillDisappear(animated)
  134. PQLoadingHUB.shared.dismissHUB()
  135. }
  136. override open func viewDidDisappear(_ animated: Bool) {
  137. super.viewDidDisappear(animated)
  138. if view.viewWithTag(cGuideTag) != nil {
  139. view.viewWithTag(cGuideTag)?.removeFromSuperview()
  140. }
  141. }
  142. deinit {
  143. PQNotification.removeObserver(self)
  144. BFLog(message: "vc \(String(describing: type(of: self))) release \(String(format: "%p", self))")
  145. }
  146. override open var preferredStatusBarStyle: UIStatusBarStyle {
  147. if PQBFConfig.shared.statusBarStyle == .dark {
  148. if #available(iOS 13.0, *) {
  149. return .darkContent
  150. } else {
  151. return .default
  152. }
  153. } else {
  154. return .lightContent
  155. }
  156. }
  157. override open var prefersStatusBarHidden: Bool {
  158. return isHiddenStatus
  159. }
  160. /// 监听滑动返回
  161. /// - Returns: <#description#>
  162. public func disablePopGesture() -> PQBaseViewController {
  163. let traget = navigationController?.interactivePopGestureRecognizer?.delegate
  164. let pan = UIPanGestureRecognizer(target: traget, action: #selector(popGesture(panGes:)))
  165. view.addGestureRecognizer(pan)
  166. return self
  167. }
  168. /// 拦截侧滑手势
  169. /// - Returns: <#description#>
  170. @objc private func popGesture(panGes: UIPanGestureRecognizer) {
  171. if panGes.state == .ended {
  172. let translation = panGes.translation(in: view)
  173. if popGestureHandle != nil, translationDric(translation: translation) == .moveDirectionRight, translation.x > 60 {
  174. popGestureHandle!()
  175. }
  176. }
  177. }
  178. open func gestureRecognizer(_: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
  179. if touch.view is UISlider {
  180. return false
  181. }
  182. return true
  183. }
  184. /// 判断滑动方向
  185. /// - Parameter translation: <#translation description#>
  186. /// - Returns: <#description#>
  187. func translationDric(translation: CGPoint) -> moveDirection {
  188. let absX = abs(translation.x)
  189. let absY = abs(translation.y)
  190. // 设置滑动有效距离
  191. if max(absX, absY) < 10 {
  192. return .moveDirectionNormal
  193. }
  194. if absX > absY {
  195. if translation.x < 0 {
  196. return .moveDirectionLeft
  197. } else {
  198. return .moveDirectionRight
  199. }
  200. } else if absY > absX {
  201. if translation.y < 0 {
  202. return .moveDirectionUp
  203. } else {
  204. return .moveDirectionDown
  205. }
  206. }
  207. return .moveDirectionNormal
  208. }
  209. }