LNGenderSetupViewController.swift 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. //
  2. // LNGenderSetupViewController.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/12/2.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. extension UIView {
  11. func pushToGenderSetup() {
  12. let vc = LNGenderSetupViewController()
  13. navigationController?.pushViewController(vc, animated: true)
  14. }
  15. }
  16. class LNGenderSetupViewController: LNViewController {
  17. private let maleIc = UIImageView()
  18. private let maleBg = UIImageView()
  19. private let maleLabel = UILabel()
  20. private let femaleIc = UIImageView()
  21. private let femaleBg = UIImageView()
  22. private let femaleLabel = UILabel()
  23. private let nextButton = UIButton()
  24. private var curGender: LNUserGender = .unknow {
  25. didSet {
  26. switch curGender {
  27. case .male:
  28. maleIc.image = .icLoginGenderMaleSelected
  29. maleBg.image = .icLoginGenderSelected
  30. maleLabel.textColor = .text_1
  31. femaleIc.image = .icLoginGenderFemale
  32. femaleBg.image = nil
  33. femaleLabel.textColor = .text_5
  34. case .female:
  35. maleIc.image = .icLoginGenderMale
  36. maleBg.image = nil
  37. maleLabel.textColor = .text_5
  38. femaleIc.image = .icLoginGenderFemaleSelected
  39. femaleBg.image = .icLoginGenderSelected
  40. femaleLabel.textColor = .text_1
  41. case .unknow:
  42. break
  43. }
  44. nextButton.isEnabled = curGender != .unknow
  45. }
  46. }
  47. override func viewDidLoad() {
  48. super.viewDidLoad()
  49. enableDragBack = false
  50. setupViews()
  51. }
  52. }
  53. extension LNGenderSetupViewController {
  54. private func setupViews() {
  55. navigationBarColor = .clear
  56. let bg = UIImageView()
  57. bg.image = .icLoginProfileBg
  58. view.addSubview(bg)
  59. bg.snp.makeConstraints { make in
  60. make.horizontalEdges.equalToSuperview()
  61. make.top.equalTo(fakeNaviBgView)
  62. }
  63. setupNavigationBar()
  64. let titles = buildTitles()
  65. view.addSubview(titles)
  66. titles.snp.makeConstraints { make in
  67. make.horizontalEdges.equalToSuperview().inset(22)
  68. make.top.equalToSuperview().offset(22)
  69. }
  70. let gender = buildGenderView()
  71. view.addSubview(gender)
  72. gender.snp.makeConstraints { make in
  73. make.centerY.equalToSuperview().multipliedBy(0.8)
  74. make.horizontalEdges.equalToSuperview().inset(16)
  75. }
  76. nextButton.setBackgroundImage(.primary_8, for: .normal)
  77. nextButton.setTitle(.init(key: "A00101"), for: .normal)
  78. nextButton.setTitleColor(.text_1, for: .normal)
  79. nextButton.titleLabel?.font = .heading_h3
  80. nextButton.layer.cornerRadius = 23.5
  81. nextButton.clipsToBounds = true
  82. nextButton.isEnabled = false
  83. nextButton.addAction(UIAction(handler: { [weak self] _ in
  84. guard let self else { return }
  85. let config = LNProfileUpdateConfig()
  86. config.gender = self.curGender
  87. self.view.pushToBaseInfoSetup(config)
  88. }), for: .touchUpInside)
  89. view.addSubview(nextButton)
  90. nextButton.snp.makeConstraints { make in
  91. make.horizontalEdges.equalToSuperview().inset(16)
  92. make.bottom.equalTo(view.safeAreaLayoutGuide.snp.bottom).offset(-4)
  93. make.height.equalTo(47)
  94. }
  95. }
  96. private func buildTitles() -> UIView {
  97. let stackView = UIStackView()
  98. stackView.axis = .vertical
  99. stackView.spacing = 6
  100. let mainLabel = UILabel()
  101. mainLabel.text = .init(key: "A00106")
  102. mainLabel.font = .init(name: UIFont.boldFontName, size: 40)
  103. mainLabel.textColor = .text_5
  104. mainLabel.numberOfLines = 0
  105. stackView.addArrangedSubview(mainLabel)
  106. let subTitleLabel = UILabel()
  107. subTitleLabel.text = .init(key: "A00107")
  108. subTitleLabel.font = .heading_h1
  109. subTitleLabel.textColor = .text_5
  110. subTitleLabel.numberOfLines = 0
  111. stackView.addArrangedSubview(subTitleLabel)
  112. let descLabel = UILabel()
  113. descLabel.font = .body_m
  114. descLabel.textColor = .text_4
  115. descLabel.text = .init(key: "A00108")
  116. descLabel.numberOfLines = 0
  117. stackView.addArrangedSubview(descLabel)
  118. return stackView
  119. }
  120. private func buildGenderView() -> UIView {
  121. let container = UIView()
  122. let maleView = UIView()
  123. maleView.onTap { [weak self] in
  124. guard let self else { return }
  125. self.curGender = .male
  126. }
  127. container.addSubview(maleView)
  128. maleView.snp.makeConstraints { make in
  129. make.verticalEdges.equalToSuperview()
  130. make.centerX.equalToSuperview().multipliedBy(0.5)
  131. }
  132. let maleImage: UIImage = .icLoginGenderSelected
  133. maleBg.backgroundColor = .fill_2
  134. maleBg.layer.cornerRadius = 30
  135. maleBg.isUserInteractionEnabled = false
  136. maleView.addSubview(maleBg)
  137. maleBg.snp.makeConstraints { make in
  138. make.horizontalEdges.equalToSuperview()
  139. make.bottom.equalToSuperview()
  140. make.size.equalTo(maleImage.size)
  141. }
  142. maleIc.image = .icLoginGenderMale
  143. maleIc.isUserInteractionEnabled = false
  144. maleView.addSubview(maleIc)
  145. maleIc.snp.makeConstraints { make in
  146. make.centerX.equalToSuperview()
  147. make.top.equalToSuperview()
  148. make.bottom.equalTo(maleBg.snp.bottom).offset(-68)
  149. }
  150. maleLabel.text = .init(key: "A00109")
  151. maleLabel.font = .heading_h1_5
  152. maleLabel.textColor = .text_5
  153. maleView.addSubview(maleLabel)
  154. maleLabel.snp.makeConstraints { make in
  155. make.centerX.equalToSuperview()
  156. make.bottom.equalToSuperview().offset(-16)
  157. }
  158. let femaleView = UIView()
  159. femaleView.onTap { [weak self] in
  160. guard let self else { return }
  161. self.curGender = .female
  162. }
  163. container.addSubview(femaleView)
  164. femaleView.snp.makeConstraints { make in
  165. make.verticalEdges.equalToSuperview()
  166. make.centerX.equalToSuperview().multipliedBy(1.5)
  167. }
  168. let femaleImage: UIImage = .icLoginGenderSelected
  169. femaleBg.backgroundColor = .fill_2
  170. femaleBg.layer.cornerRadius = 30
  171. femaleBg.isUserInteractionEnabled = false
  172. femaleView.addSubview(femaleBg)
  173. femaleBg.snp.makeConstraints { make in
  174. make.horizontalEdges.equalToSuperview()
  175. make.bottom.equalToSuperview()
  176. make.size.equalTo(femaleImage.size)
  177. }
  178. femaleIc.image = .icLoginGenderFemale
  179. femaleIc.isUserInteractionEnabled = false
  180. femaleView.addSubview(femaleIc)
  181. femaleIc.snp.makeConstraints { make in
  182. make.centerX.equalToSuperview()
  183. make.top.equalToSuperview()
  184. make.bottom.equalTo(femaleBg.snp.bottom).offset(-68)
  185. }
  186. femaleLabel.text = .init(key: "A00110")
  187. femaleLabel.font = .heading_h1_5
  188. femaleLabel.textColor = .text_5
  189. femaleView.addSubview(femaleLabel)
  190. femaleLabel.snp.makeConstraints { make in
  191. make.centerX.equalToSuperview()
  192. make.bottom.equalToSuperview().offset(-16)
  193. }
  194. return container
  195. }
  196. private func setupNavigationBar() {
  197. customBack = { [weak self] in
  198. guard let self else { return }
  199. navigationController?.popViewController(animated: true)
  200. LNAccountManager.shared.logout()
  201. }
  202. let skipButton = UIButton()
  203. skipButton.setTitle(.init(key: "A00286"), for: .normal)
  204. skipButton.titleLabel?.font = .heading_h2
  205. skipButton.setTitleColor(.text_5, for: .normal)
  206. skipButton.addAction(UIAction(handler: { [weak self] _ in
  207. guard let self else { return }
  208. let config = LNProfileUpdateConfig()
  209. view.pushToBaseInfoSetup(config)
  210. }), for: .touchUpInside)
  211. setRightButton(skipButton)
  212. }
  213. }
  214. #if DEBUG
  215. import SwiftUI
  216. struct LNGenderSetupViewControllerPreview: UIViewControllerRepresentable {
  217. func makeUIViewController(context: Context) -> some UIViewController {
  218. LNGenderSetupViewController()
  219. }
  220. func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {
  221. }
  222. }
  223. #Preview(body: {
  224. LNGenderSetupViewControllerPreview()
  225. })
  226. #endif