NYArticleViewController.swift 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. //
  2. // NYArticleViewController.swift
  3. // JSJP_Student_sw
  4. //
  5. // Created by Ning.ge on 2023/6/1.
  6. //
  7. import UIKit
  8. import WebKit
  9. final class NYArticleViewController: BaseViewController {
  10. private var statusBar: UIStatusBarStyle = .default
  11. private var link: String
  12. private let maxOffest: CGFloat = isIphoneX ? 88 : 64
  13. private let minOffest: CGFloat = isIphoneX ? 44 : 32
  14. private lazy var webView: WKWebView = {
  15. let webView = WKWebView(frame: .zero)
  16. webView.scrollView.backgroundColor = UIColor.db_gray
  17. return webView
  18. }()
  19. private lazy var navBar: NYArticleNavBar = {
  20. let navBar = NYArticleNavBar.loadFromNib()
  21. navBar.backgroundColor = UIColor.db_white
  22. navBar.alpha = 0
  23. navBar.backButton.setImage(NYImage.Home.back?.with(color: UIColor.db_pink), for: .normal)
  24. navBar.shareButton.setImage(NYImage.Article.more?.with(color: UIColor.db_pink), for: .normal)
  25. navBar.applyButton.setImage(NYImage.Home.editRcmd?.with(color: UIColor.db_pink), for: .normal)
  26. return navBar
  27. }()
  28. private lazy var backButton: UIButton = {
  29. let backButton = UIButton(frame: .zero)
  30. backButton.setImage(NYImage.Home.back, for: .normal)
  31. return backButton
  32. }()
  33. private lazy var shareButton: UIButton = {
  34. let shareButton = UIButton(frame: .zero)
  35. shareButton.setImage(NYImage.Article.more?.with(color: UIColor.db_white), for: .normal)
  36. return shareButton
  37. }()
  38. init(link:String) {
  39. self.link = link
  40. super.init()
  41. log.info(link)
  42. }
  43. required convenience init?(coder aDecoder: NSCoder) {
  44. fatalError("init(coder:) has not been implemented")
  45. }
  46. override func setupConstraints() {
  47. webView.snp.makeConstraints { (make) in
  48. make.edges.equalToSuperview()
  49. }
  50. navBar.snp.makeConstraints { (make) in
  51. make.top.left.right.equalToSuperview()
  52. make.height.equalTo(maxOffest)
  53. }
  54. backButton.snp.makeConstraints { (make) in
  55. make.width.height.equalTo(30)
  56. make.left.equalTo(15)
  57. make.centerY.equalTo(navBar.snp.centerY).offset(20)
  58. }
  59. shareButton.snp.makeConstraints { (make) in
  60. make.width.height.equalTo(30)
  61. make.right.equalTo(-15)
  62. make.centerY.equalTo(navBar.snp.centerY).offset(20)
  63. }
  64. }
  65. override var preferredStatusBarStyle: UIStatusBarStyle {
  66. return statusBar
  67. }
  68. override func viewWillAppear(_ animated: Bool) {
  69. super.viewWillAppear(animated)
  70. self.navigationController?.setNavigationBarHidden(true, animated: true)
  71. statusBar = .default
  72. self.setNeedsStatusBarAppearanceUpdate()
  73. }
  74. override func viewWillDisappear(_ animated: Bool) {
  75. super.viewWillDisappear(animated)
  76. statusBar = .lightContent
  77. self.setNeedsStatusBarAppearanceUpdate()
  78. }
  79. override func viewDidLoad() {
  80. super.viewDidLoad()
  81. self.view.addSubview(webView)
  82. self.view.addSubview(navBar)
  83. self.view.addSubview(backButton)
  84. self.view.addSubview(shareButton)
  85. webView.navigationDelegate = self
  86. webView.allowsBackForwardNavigationGestures = true
  87. webView.scrollView.delegate = self
  88. if #available(iOS 11, *) {
  89. webView.scrollView.contentInsetAdjustmentBehavior = .never
  90. } else {
  91. self.automaticallyAdjustsScrollViewInsets = false
  92. }
  93. if let linkURL = URL(string: link) {
  94. webView.load(URLRequest(url: linkURL))
  95. }
  96. self.clickEvent()
  97. }
  98. private func loadProgress() {
  99. webView.rx.observe(Double.self, "estimatedProgress")
  100. .filterNil()
  101. .subscribe(onNext: { (_) in
  102. })
  103. .disposed(by: disposeBag)
  104. }
  105. private func clickEvent() {
  106. navBar.backButton.rx.tap
  107. .subscribe(onNext: {[unowned self] (_) in
  108. self.navigationController?.popViewController(animated: true)
  109. })
  110. .disposed(by: disposeBag)
  111. backButton.rx.tap
  112. .subscribe(onNext: {[unowned self] (_) in
  113. self.navigationController?.popViewController(animated: true)
  114. })
  115. .disposed(by: disposeBag)
  116. }
  117. }
  118. extension NYArticleViewController: WKNavigationDelegate {
  119. func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
  120. webView.evaluateJavaScript("document.getElementsByClassName(\"top-holder\")[0].hidden = true;", completionHandler: nil)
  121. }
  122. func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
  123. }
  124. func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
  125. if navigationAction.targetFrame == nil {
  126. webView.load(navigationAction.request)
  127. }
  128. decisionHandler(.allow)
  129. }
  130. }
  131. extension NYArticleViewController: UIScrollViewDelegate {
  132. func scrollViewDidScroll(_ scrollView: UIScrollView) {
  133. let offestY = scrollView.contentOffset.y
  134. if offestY > 0 {
  135. backButton.alpha = 0
  136. shareButton.alpha = 0
  137. let alpha = (offestY+minOffest)/maxOffest
  138. navBar.alpha = alpha
  139. navBar.titleLabel.text = webView.title
  140. } else {
  141. backButton.alpha = 1
  142. shareButton.alpha = 1
  143. navBar.alpha = 0
  144. }
  145. }
  146. }