LNAboutViewController.swift 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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 = .init(named: "ic_gami")
  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. let versionLabel = UILabel()
  44. versionLabel.text = .init(key: "A00248", curAppVersion)
  45. versionLabel.font = .body_s
  46. versionLabel.textColor = .text_5
  47. view.addSubview(versionLabel)
  48. versionLabel.snp.makeConstraints { make in
  49. make.centerX.equalToSuperview()
  50. make.top.equalTo(nameIc.snp.bottom).offset(13)
  51. }
  52. let infoView = UIView()
  53. infoView.backgroundColor = .fill
  54. infoView.layer.cornerRadius = 12
  55. view.addSubview(infoView)
  56. infoView.snp.makeConstraints { make in
  57. make.directionalHorizontalEdges.equalToSuperview().inset(16)
  58. make.top.equalTo(versionLabel.snp.bottom).offset(40)
  59. }
  60. let stackView = UIStackView()
  61. stackView.axis = .vertical
  62. stackView.spacing = 26
  63. infoView.addSubview(stackView)
  64. stackView.snp.makeConstraints { make in
  65. make.directionalEdges.equalToSuperview().inset(16)
  66. }
  67. let privacy = buildFunctionItem(title: .init(key: "A00249"), infoView: nil)
  68. privacy.onTap { [weak self] in
  69. guard let self else { return }
  70. view.pushToWebView(.init(url: .privacyUrl))
  71. }
  72. stackView.addArrangedSubview(privacy)
  73. let service = buildFunctionItem(title: .init(key: "A00250"), infoView: nil)
  74. service.onTap { [weak self] in
  75. guard let self else { return }
  76. view.pushToWebView(.init(url: .serviceUrl))
  77. }
  78. stackView.addArrangedSubview(service)
  79. let social = buildFunctionItem(title: .init(key: "A00251"), infoView: nil)
  80. social.onTap { [weak self] in
  81. guard let self else { return }
  82. view.pushToWebView(.init(url: .communityUrl))
  83. }
  84. stackView.addArrangedSubview(social)
  85. let newVersion = LNNewVersionView()
  86. newVersion.isHidden = !LNAppConfig.shared.hasNewVersion
  87. let version = buildFunctionItem(title: .init(key: "A00252"), infoView: newVersion)
  88. version.onTap {
  89. if LNAppConfig.shared.hasNewVersion {
  90. LNAppConfig.shared.jumpToAppStore()
  91. } else {
  92. showToast(.init(key: "A00253"))
  93. }
  94. }
  95. stackView.addArrangedSubview(version)
  96. }
  97. private func buildFunctionItem(title: String, infoView: UIView?) -> UIView {
  98. let container = UIView()
  99. let arrow = UIImageView.arrowImageView(size: 14)
  100. arrow.tintColor = .text_4
  101. container.addSubview(arrow)
  102. arrow.snp.makeConstraints { make in
  103. make.centerY.equalToSuperview()
  104. make.trailing.equalToSuperview()
  105. }
  106. if let infoView {
  107. container.addSubview(infoView)
  108. infoView.snp.makeConstraints { make in
  109. make.centerY.equalToSuperview()
  110. make.trailing.equalTo(arrow.snp.leading).offset(-2)
  111. }
  112. }
  113. let titleLabel = UILabel()
  114. titleLabel.font = .body_s
  115. titleLabel.textColor = .text_5
  116. titleLabel.text = title
  117. container.addSubview(titleLabel)
  118. titleLabel.snp.makeConstraints { make in
  119. make.leading.equalToSuperview()
  120. make.verticalEdges.equalToSuperview()
  121. make.trailing.lessThanOrEqualTo((infoView ?? arrow).snp.leading)
  122. }
  123. return container
  124. }
  125. func getAppIcon() -> UIImage? {
  126. guard let infoPlist = Bundle.main.infoDictionary,
  127. let iconDict = infoPlist["CFBundleIcons"] as? [String: Any],
  128. let primaryIcon = iconDict["CFBundlePrimaryIcon"] as? [String: Any],
  129. let iconFiles = primaryIcon["CFBundleIconFiles"] as? [String],
  130. let lastIconName = iconFiles.last else {
  131. return nil
  132. }
  133. return UIImage(named: lastIconName)
  134. }
  135. }