LNAboutViewController.swift 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. //
  2. // LNAboutViewController.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/12/22.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. extension UIView {
  11. func pushToAbout() {
  12. let vc = LNAboutViewController()
  13. navigationController?.pushViewController(vc, animated: true)
  14. }
  15. }
  16. class LNAboutViewController: LNViewController {
  17. override func viewDidLoad() {
  18. super.viewDidLoad()
  19. setupViews()
  20. }
  21. }
  22. extension LNAboutViewController {
  23. private func setupViews() {
  24. title = .init(key: "A00247")
  25. view.backgroundColor = .primary_1
  26. let icon = UIImageView()
  27. icon.image = getAppIcon()
  28. icon.layer.cornerRadius = 16
  29. icon.clipsToBounds = true
  30. view.addSubview(icon)
  31. icon.snp.makeConstraints { make in
  32. make.centerX.equalToSuperview()
  33. make.top.equalToSuperview().offset(40)
  34. make.width.height.equalTo(72)
  35. }
  36. let nameIc = UIImageView()
  37. nameIc.image = .icGami
  38. view.addSubview(nameIc)
  39. nameIc.snp.makeConstraints { make in
  40. make.centerX.equalToSuperview()
  41. make.top.equalTo(icon.snp.bottom).offset(7)
  42. }
  43. var versionStr: String = .init(key: "A00248", curAppVersion)
  44. #if DEBUG
  45. versionStr += "(\(curBuildVersion))"
  46. #endif
  47. let versionLabel = UILabel()
  48. versionLabel.text = versionStr
  49. versionLabel.font = .body_s
  50. versionLabel.textColor = .text_5
  51. view.addSubview(versionLabel)
  52. versionLabel.snp.makeConstraints { make in
  53. make.centerX.equalToSuperview()
  54. make.top.equalTo(nameIc.snp.bottom).offset(13)
  55. }
  56. let infoView = UIView()
  57. infoView.backgroundColor = .fill
  58. infoView.layer.cornerRadius = 12
  59. view.addSubview(infoView)
  60. infoView.snp.makeConstraints { make in
  61. make.horizontalEdges.equalToSuperview().inset(16)
  62. make.top.equalTo(versionLabel.snp.bottom).offset(40)
  63. }
  64. let stackView = UIStackView()
  65. stackView.axis = .vertical
  66. stackView.spacing = 26
  67. infoView.addSubview(stackView)
  68. stackView.snp.makeConstraints { make in
  69. make.edges.equalToSuperview().inset(16)
  70. }
  71. let privacy = buildFunctionItem(title: .init(key: "A00249"), infoView: nil)
  72. privacy.onTap { [weak self] in
  73. guard let self else { return }
  74. view.pushToWebView(LNJumpWebViewConfig.normalConfig(url: .privacyUrl))
  75. }
  76. stackView.addArrangedSubview(privacy)
  77. let service = buildFunctionItem(title: .init(key: "A00250"), infoView: nil)
  78. service.onTap { [weak self] in
  79. guard let self else { return }
  80. view.pushToWebView(LNJumpWebViewConfig.normalConfig(url: .serviceUrl))
  81. }
  82. stackView.addArrangedSubview(service)
  83. let social = buildFunctionItem(title: .init(key: "A00251"), infoView: nil)
  84. social.onTap { [weak self] in
  85. guard let self else { return }
  86. view.pushToWebView(LNJumpWebViewConfig.normalConfig(url: .communityUrl))
  87. }
  88. stackView.addArrangedSubview(social)
  89. let newVersion = LNNewVersionView()
  90. newVersion.isHidden = !LNAppConfig.shared.hasNewVersion
  91. let version = buildFunctionItem(title: .init(key: "A00252"), infoView: newVersion)
  92. version.onTap {
  93. if LNAppConfig.shared.hasNewVersion {
  94. LNAppConfig.shared.jumpToAppStore()
  95. } else {
  96. showToast(.init(key: "A00253"))
  97. }
  98. }
  99. stackView.addArrangedSubview(version)
  100. }
  101. private func buildFunctionItem(title: String, infoView: UIView?) -> UIView {
  102. let container = UIView()
  103. let arrow = UIImageView.arrowImageView(size: 14)
  104. arrow.tintColor = .text_4
  105. container.addSubview(arrow)
  106. arrow.snp.makeConstraints { make in
  107. make.centerY.equalToSuperview()
  108. make.trailing.equalToSuperview()
  109. }
  110. if let infoView {
  111. container.addSubview(infoView)
  112. infoView.snp.makeConstraints { make in
  113. make.centerY.equalToSuperview()
  114. make.trailing.equalTo(arrow.snp.leading).offset(-2)
  115. }
  116. }
  117. let titleLabel = UILabel()
  118. titleLabel.font = .body_s
  119. titleLabel.textColor = .text_5
  120. titleLabel.text = title
  121. container.addSubview(titleLabel)
  122. titleLabel.snp.makeConstraints { make in
  123. make.leading.equalToSuperview()
  124. make.verticalEdges.equalToSuperview()
  125. make.trailing.lessThanOrEqualTo((infoView ?? arrow).snp.leading)
  126. }
  127. return container
  128. }
  129. func getAppIcon() -> UIImage? {
  130. guard let infoPlist = Bundle.main.infoDictionary,
  131. let iconDict = infoPlist["CFBundleIcons"] as? [String: Any],
  132. let primaryIcon = iconDict["CFBundlePrimaryIcon"] as? [String: Any],
  133. let iconFiles = primaryIcon["CFBundleIconFiles"] as? [String],
  134. let lastIconName = iconFiles.last else {
  135. return nil
  136. }
  137. return UIImage(named: lastIconName)
  138. }
  139. }