PQBaseViewController.swift 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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 UIKit
  11. open class PQBaseViewController: UIViewController, UIGestureRecognizerDelegate {
  12. // 侧滑拦截返回
  13. public var popGestureHandle: (() -> Void)?
  14. public var naviTitle: String? // 标题
  15. public var rightButton: UIButton? // 右边按钮
  16. public var backButton: UIButton? // 左边按钮
  17. public var navTitleLabel: UILabel? // 标题
  18. public var navHeadImageView: UIImageView? // 导航条
  19. public var lineView: UIView? // 导航分隔线
  20. public var isHiddenStatus: Bool = false { // 更新状态栏
  21. didSet {
  22. setNeedsStatusBarAppearanceUpdate()
  23. }
  24. }
  25. /// <#Description#>
  26. public var isPresent: Bool {
  27. var isPresent = true
  28. let viewcontrollers = navigationController?.viewControllers
  29. if (viewcontrollers?.count ?? 0) > 1 {
  30. if viewcontrollers?[(viewcontrollers?.count ?? 1) - 1] == self {
  31. isPresent = false
  32. }
  33. }
  34. return isPresent
  35. }
  36. public lazy var manager: NetworkReachabilityManager? = {
  37. let manager = NetworkReachabilityManager(host: "www.baidu.com")
  38. manager?.listener = { status in
  39. if status == .reachable(.wwan) || status == .reachable(.ethernetOrWiFi) {}
  40. }
  41. return manager
  42. }()
  43. override open func viewDidLoad() {
  44. super.viewDidLoad()
  45. navigationController?.isNavigationBarHidden = true
  46. view.backgroundColor = PQBFConfig.shared.styleBackGroundColor
  47. navHeadImageView = UIImageView(image: UIImage())
  48. navHeadImageView?.isUserInteractionEnabled = true
  49. navHeadImageView?.backgroundColor = PQBFConfig.shared.styleBackGroundColor
  50. navHeadImageView?.frame = CGRect(x: 0, y: 0, width: cScreenWidth, height: cDevice_iPhoneNavBarAndStatusBarHei)
  51. view.addSubview(navHeadImageView!)
  52. lineView = UIView(frame: CGRect(x: 0, y: (navHeadImageView?.frame.maxY ?? cDevice_iPhoneNavBarAndStatusBarHei) - 0.5, width: cScreenWidth, height: 0.5))
  53. lineView?.backgroundColor = PQBFConfig.shared.styleBackGroundColor
  54. view.addSubview(lineView!)
  55. UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
  56. automaticallyAdjustsScrollViewInsets = false
  57. navigationController?.interactivePopGestureRecognizer?.delegate = self
  58. fd_prefersNavigationBarHidden = true
  59. }
  60. public func hiddenNavigation() {
  61. navHeadImageView?.isHidden = true
  62. lineView?.isHidden = true
  63. }
  64. public func showNavigation() {
  65. if navHeadImageView != nil {
  66. navHeadImageView?.isHidden = false
  67. lineView?.isHidden = false
  68. view.bringSubviewToFront(navHeadImageView!)
  69. }
  70. }
  71. open func leftBackButton() {
  72. leftButton(image: "icon_detail_back")
  73. }
  74. public func leftButton(image: String?, tintColor: UIColor? = nil) {
  75. let leftButton = UIButton(type: .custom)
  76. leftButton.frame = CGRect(x: 0, y: cDevice_iPhoneStatusBarHei, width: cDefaultMargin * 4, height: cDefaultMargin * 4)
  77. leftButton.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: -5, right: 0)
  78. if tintColor != nil {
  79. leftButton.tintColor = tintColor
  80. leftButton.setImage(UIImage().BF_Image(named: image ?? "icon_detail_back").withRenderingMode(.alwaysTemplate), for: .normal)
  81. } else {
  82. leftButton.setImage(UIImage().BF_Image(named: image ?? "icon_detail_back"), for: .normal)
  83. }
  84. leftButton.addTarget(self, action: #selector(backBtnClick), for: .touchUpInside)
  85. navHeadImageView?.addSubview(leftButton)
  86. backButton = leftButton
  87. }
  88. public func rightButtonItem(image: String?, title: String?) {
  89. let rightButtonItem = UIButton(type: .custom)
  90. var rightW: CGFloat = cDefaultMargin
  91. if title != nil, title?.count ?? 0 > 0 {
  92. rightW = rightW + sizeWithText(text: title ?? "", font: UIFont.systemFont(ofSize: 16), size: CGSize(width: CGFloat.greatestFiniteMagnitude, height: cDefaultMargin * 4)).width
  93. rightButtonItem.setTitle(title, for: .normal)
  94. rightButtonItem.setTitleColor(UIColor.hexColor(hexadecimal: "#242F44"), for: .normal)
  95. rightButtonItem.titleLabel?.font = UIFont.systemFont(ofSize: 16)
  96. }
  97. if image != nil, image?.count ?? 0 > 0 {
  98. rightW = rightW + cDefaultMargin * 4
  99. rightButtonItem.setImage(UIImage(named: image ?? ""), for: .normal)
  100. rightButtonItem.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: (title != nil && title?.count ?? 0 > 0) ? 0 : -5, right: 0)
  101. }
  102. rightButtonItem.adjustsImageWhenHighlighted = false
  103. rightButtonItem.frame = CGRect(x: cScreenWidth - rightW, y: cDevice_iPhoneStatusBarHei, width: rightW, height: cDefaultMargin * 4)
  104. rightButtonItem.addTarget(self, action: #selector(rightBtnClick(sender:)), for: .touchUpInside)
  105. rightButtonItem.contentHorizontalAlignment = .center
  106. navHeadImageView?.addSubview(rightButtonItem)
  107. rightButton = rightButtonItem
  108. }
  109. public func setTitle(title: String?, color: UIColor = UIColor.white) {
  110. naviTitle = title
  111. if navTitleLabel == nil {
  112. let titleLabel = UILabel(frame: CGRect(x: cDefaultMargin * 5, y: cDevice_iPhoneStatusBarHei, width: cScreenWidth - 100, height: cDefaultMargin * 4))
  113. titleLabel.textColor = color
  114. titleLabel.textAlignment = .center
  115. navTitleLabel = titleLabel
  116. navHeadImageView?.addSubview(titleLabel)
  117. }
  118. navTitleLabel?.text = title
  119. }
  120. @objc open func rightBtnClick(sender _: UIButton) {}
  121. @objc open func backBtnClick() {
  122. if isPresent {
  123. dismiss(animated: true, completion: nil)
  124. } else {
  125. navigationController?.popViewController(animated: true)
  126. }
  127. }
  128. override open func viewDidAppear(_ animated: Bool) {
  129. super.viewDidAppear(animated)
  130. }
  131. override open func viewWillDisappear(_ animated: Bool) {
  132. super.viewWillDisappear(animated)
  133. PQLoadingHUB.shared.dismissHUB()
  134. }
  135. override open func viewDidDisappear(_ animated: Bool) {
  136. super.viewDidDisappear(animated)
  137. if view.viewWithTag(cGuideTag) != nil {
  138. view.viewWithTag(cGuideTag)?.removeFromSuperview()
  139. }
  140. }
  141. deinit {
  142. PQNotification.removeObserver(self)
  143. BFLog(message: "\(String(describing: type(of: self)))被销毁")
  144. }
  145. override open var preferredStatusBarStyle: UIStatusBarStyle {
  146. if PQBFConfig.shared.statusBarStyle == .dark {
  147. if #available(iOS 13.0, *) {
  148. return .darkContent
  149. } else {
  150. return .default
  151. }
  152. } else {
  153. return .lightContent
  154. }
  155. }
  156. override open var prefersStatusBarHidden: Bool {
  157. return isHiddenStatus
  158. }
  159. /// 禁止滑动返回
  160. /// - Returns: <#description#>
  161. public func disablePopGesture() -> PQBaseViewController {
  162. let traget = navigationController?.interactivePopGestureRecognizer?.delegate
  163. let pan = UIPanGestureRecognizer(target: traget, action: #selector(popGesture(panGes:)))
  164. view.addGestureRecognizer(pan)
  165. return self
  166. }
  167. /// 拦截侧滑手势
  168. /// - Returns: <#description#>
  169. @objc private func popGesture(panGes: UIPanGestureRecognizer) {
  170. if panGes.state == .ended, popGestureHandle != nil {
  171. popGestureHandle!()
  172. }
  173. }
  174. open func gestureRecognizer(_: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
  175. if touch.view is UISlider {
  176. return false
  177. }
  178. return true
  179. }
  180. }