TSAIListHintBaseVC.swift 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. //
  2. // TSAIListHintBaseVC.swift
  3. // AIEmoji
  4. //
  5. // Created by 100Years on 2025/4/9.
  6. //
  7. import PhotosUI
  8. class TSAIListHintBaseVC: TSBaseVC {
  9. static var userDefaultsKey:String = "isFirstAIListAge"
  10. struct Config {
  11. var imageMaxBitSize:Int
  12. var goodImageNamed:String
  13. var badImageNamed:String
  14. var titleText:String
  15. var titleSubText:String
  16. var goodText:String
  17. var goodInfoText:String
  18. var badText:String
  19. var badInfoText:String
  20. init(imageMaxBitSize: Int, goodImageNamed: String, badImageNamed: String, titleText: String, titleSubText: String, goodText: String, goodInfoText: String, badText: String, badInfoText: String) {
  21. self.imageMaxBitSize = imageMaxBitSize
  22. self.goodImageNamed = goodImageNamed
  23. self.badImageNamed = badImageNamed
  24. self.titleText = titleText
  25. self.titleSubText = titleSubText
  26. self.goodText = goodText
  27. self.goodInfoText = goodInfoText
  28. self.badText = badText
  29. self.badInfoText = badInfoText
  30. }
  31. static func getDefaultConfig(imageMaxBitSize:Int) -> Config {
  32. var config = defaultConfig
  33. config.imageMaxBitSize = imageMaxBitSize
  34. return config
  35. }
  36. static var defaultConfig:Config {
  37. return Config(imageMaxBitSize: kUploadImageMaxBit10Size,
  38. goodImageNamed: "ptp_goodImage",
  39. badImageNamed: "ptp_badImage",
  40. titleText: "Upload your photos".localized,
  41. titleSubText: "",
  42. goodText: "Good photo examples".localized,
  43. goodInfoText: "Fully clear and visible face, in good lighting".localized,
  44. badText: "Bad photo examples".localized,
  45. badInfoText: "Group photos, covered faces, nudes".localized)
  46. }
  47. static var changeHairConfig:Config {
  48. return Config(imageMaxBitSize: kUploadImageMaxBit5Size,
  49. goodImageNamed: "ptp_hair_goodImage",
  50. badImageNamed: "ptp_hair_badImage",
  51. titleText: "Upload your photos".localized,
  52. titleSubText: String(format:"(Size ≤ %dMB)".localized , 5),
  53. goodText: "Good photo examples".localized,
  54. goodInfoText: "Obvious hairstyle, Fully clear and visible face".localized,
  55. badText: "Bad photo examples".localized,
  56. badInfoText: "Group photos, covered faces, skinhead".localized)
  57. }
  58. }
  59. var config:Config = Config.defaultConfig
  60. init(config: Config, clickUpImageHandle: ((UIImage?) -> Void)? = nil) {
  61. self.config = config
  62. self.clickUpImageHandle = clickUpImageHandle
  63. super.init()
  64. }
  65. @MainActor required init?(coder: NSCoder) {
  66. fatalError("init(coder:) has not been implemented")
  67. }
  68. var clickUpImageHandle:((UIImage?)->Void)?
  69. lazy var popupContentView: UIView = {
  70. let popupContentView = UIView()
  71. popupContentView.backgroundColor = "#222222".uiColor
  72. popupContentView.cornerRadius = 20.0
  73. return popupContentView
  74. }()
  75. lazy var photoPickerManager: TSPhotoPickerManager = {
  76. let photoPickerManager = TSPhotoPickerManager(viewController: self)
  77. return photoPickerManager
  78. }()
  79. override func createView() {
  80. setNavBarViewHidden(true)
  81. view.backgroundColor = .black.withAlphaComponent(0.7)
  82. view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickView)))
  83. contentView.addSubview(popupContentView)
  84. popupContentView.center = view.center
  85. popupContentView.snp.makeConstraints { make in
  86. make.leading.equalTo(20)
  87. make.trailing.equalTo(-20)
  88. make.center.equalToSuperview()
  89. }
  90. setUpUI()
  91. }
  92. @objc func clickView() {
  93. dismiss()
  94. }
  95. func setUpUI(){
  96. let fullText = config.titleText+config.titleSubText
  97. let attString = NSMutableAttributedString(string: fullText)
  98. let mainRange = NSRange(location: 0, length: config.titleText.count)
  99. attString.addAttributes([.font:UIFont.font(size: 18,weight: .semibold),.foregroundColor:UIColor.white], range: NSRange(location: 0, length: config.titleText.count))
  100. attString.addAttributes([.font:UIFont.font(size: 12),.foregroundColor:UIColor.white.withAlphaComponent(0.6)], range: NSRange(location: config.titleText.count, length: config.titleSubText.count))
  101. let titleLabel = UILabel.createLabel(numberOfLines: 0)
  102. titleLabel.attributedText = attString
  103. popupContentView.addSubview(titleLabel)
  104. titleLabel.snp.makeConstraints { make in
  105. make.leading.top.equalTo(32)
  106. make.trailing.equalTo(-32)
  107. }
  108. let goodLabel = UILabel.createLabel(text: config.goodText,font: .font(size: 16,weight: .medium),textColor: .white,numberOfLines: 0)
  109. popupContentView.addSubview(goodLabel)
  110. goodLabel.snp.makeConstraints { make in
  111. make.top.equalTo(titleLabel.snp.bottom).offset(28)
  112. make.leading.equalTo(32)
  113. make.trailing.equalTo(-32)
  114. }
  115. let goodInfoLabel = UILabel.createLabel(text: config.goodInfoText,font: .font(size: 14),textColor: .white.withAlphaComponent(0.6),numberOfLines: 0)
  116. popupContentView.addSubview(goodInfoLabel)
  117. goodInfoLabel.snp.makeConstraints { make in
  118. make.top.equalTo(goodLabel.snp.bottom).offset(8)
  119. make.leading.equalTo(32)
  120. make.trailing.equalTo(-32)
  121. }
  122. let goodImageView = UIImageView.createImageView(imageName: config.goodImageNamed)
  123. popupContentView.addSubview(goodImageView)
  124. goodImageView.snp.makeConstraints { make in
  125. make.top.equalTo(goodInfoLabel.snp.bottom).offset(12)
  126. make.leading.equalTo(32)
  127. make.trailing.equalTo(-32)
  128. make.height.equalTo(108*kDesignScale)
  129. }
  130. let badLabel = UILabel.createLabel(text: config.badText,font: .font(size: 16,weight: .medium),textColor: .white,numberOfLines: 0)
  131. popupContentView.addSubview(badLabel)
  132. badLabel.snp.makeConstraints { make in
  133. make.top.equalTo(goodImageView.snp.bottom).offset(28)
  134. make.leading.equalTo(32)
  135. make.trailing.equalTo(-32)
  136. }
  137. let badInfoLabel = UILabel.createLabel(text: config.badInfoText,font: .font(size: 14),textColor: .white.withAlphaComponent(0.6),numberOfLines: 0)
  138. popupContentView.addSubview(badInfoLabel)
  139. badInfoLabel.snp.makeConstraints { make in
  140. make.top.equalTo(badLabel.snp.bottom).offset(8)
  141. make.leading.equalTo(32)
  142. make.trailing.equalTo(-32)
  143. }
  144. let badImageView = UIImageView.createImageView(imageName: config.badImageNamed)
  145. popupContentView.addSubview(badImageView)
  146. badImageView.snp.makeConstraints { make in
  147. make.top.equalTo(badInfoLabel.snp.bottom).offset(12)
  148. make.leading.equalTo(32)
  149. make.trailing.equalTo(-32)
  150. make.height.equalTo(108*kDesignScale)
  151. }
  152. let submitBtn = kCreateNormalSubmitBtn(title: "Upload Photo".localized) { [weak self] in
  153. guard let self = self else { return }
  154. pickSinglePhoto()
  155. }
  156. submitBtn.cornerRadius = 24.0
  157. popupContentView.addSubview(submitBtn)
  158. submitBtn.snp.makeConstraints { make in
  159. make.top.equalTo(badImageView.snp.bottom).offset(35)
  160. make.centerX.equalToSuperview()
  161. make.width.equalTo(250*kDesignScale)
  162. make.height.equalTo(48)
  163. make.bottom.equalTo(-24)
  164. }
  165. }
  166. static var isShowUploadImageHint:Bool{
  167. get {
  168. return UserDefaults.standard.string(forKey: userDefaultsKey) == nil
  169. }
  170. set {
  171. UserDefaults.standard.set(newValue ? nil : "1", forKey: userDefaultsKey)
  172. UserDefaults.standard.synchronize()
  173. }
  174. }
  175. func pickSinglePhoto() {
  176. // photoPickerManager.pickSinglePhoto(maxBitSize: config.imageMaxBitSize) { [weak self] image, errorString in
  177. photoPickerManager.pickCustomSinglePhoto() { [weak self] image, errorString in
  178. guard let self = self else { return }
  179. if let errorString = errorString {
  180. TSToastShared.showToast(text: errorString)
  181. }else{
  182. self.clickUpImageHandle?(image)
  183. }
  184. }
  185. }
  186. func dismissPageVC(){
  187. self.view.isHidden = true
  188. self.photoPickerManager.dismissPageVC()
  189. self.dismiss()
  190. }
  191. }