TSAIListHintBaseVC.swift 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  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: "",
  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. static var catTohumanConfig:Config {
  59. return Config(imageMaxBitSize: kUploadImageMaxBit10Size,
  60. goodImageNamed: "ptp_catTohuman_goodImage",
  61. badImageNamed: "ptp_catTohuman_badImage",
  62. titleText: "Upload your photos".localized,
  63. titleSubText: "",
  64. goodText: "Good photo examples".localized,
  65. goodInfoText: "Select pet photos with clear faces".localized,
  66. badText: "Bad photo examples".localized,
  67. badInfoText: "No clear faces or group shots".localized)
  68. }
  69. }
  70. var config:Config = Config.defaultConfig
  71. init(config: Config, clickUpImageHandle: ((UIImage?) -> Void)? = nil) {
  72. self.config = config
  73. self.clickUpImageHandle = clickUpImageHandle
  74. super.init()
  75. }
  76. @MainActor required init?(coder: NSCoder) {
  77. fatalError("init(coder:) has not been implemented")
  78. }
  79. var clickUpImageHandle:((UIImage?)->Void)?
  80. lazy var popupContentView: UIView = {
  81. let popupContentView = UIView()
  82. popupContentView.backgroundColor = "#222222".uiColor
  83. popupContentView.cornerRadius = 20.0
  84. return popupContentView
  85. }()
  86. lazy var photoPickerManager: TSPhotoPickerManager = {
  87. let photoPickerManager = TSPhotoPickerManager(viewController: self)
  88. return photoPickerManager
  89. }()
  90. lazy var submitBtn: UIButton = {
  91. let submitBtn = kCreateNormalSubmitBtn(title: "Upload Photo".localized) { [weak self] in
  92. guard let self = self else { return }
  93. pickSinglePhoto()
  94. }
  95. submitBtn.cornerRadius = 24.0
  96. return submitBtn
  97. }()
  98. override func createView() {
  99. setNavBarViewHidden(true)
  100. view.backgroundColor = .black.withAlphaComponent(0.7)
  101. view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickView)))
  102. contentView.addSubview(popupContentView)
  103. popupContentView.center = view.center
  104. popupContentView.snp.makeConstraints { make in
  105. make.leading.equalTo(20)
  106. make.trailing.equalTo(-20)
  107. make.center.equalToSuperview()
  108. }
  109. setUpUI()
  110. }
  111. @objc func clickView() {
  112. dismiss()
  113. }
  114. func setUpUI(){
  115. let fullText = config.titleText+config.titleSubText
  116. let attString = NSMutableAttributedString(string: fullText)
  117. let mainRange = NSRange(location: 0, length: config.titleText.count)
  118. attString.addAttributes([.font:UIFont.font(size: 18,weight: .semibold),.foregroundColor:UIColor.white], range: NSRange(location: 0, length: config.titleText.count))
  119. attString.addAttributes([.font:UIFont.font(size: 12),.foregroundColor:UIColor.white.withAlphaComponent(0.6)], range: NSRange(location: config.titleText.count, length: config.titleSubText.count))
  120. let titleLabel = UILabel.createLabel(numberOfLines: 0)
  121. titleLabel.attributedText = attString
  122. popupContentView.addSubview(titleLabel)
  123. titleLabel.snp.makeConstraints { make in
  124. make.leading.top.equalTo(32)
  125. make.trailing.equalTo(-32)
  126. }
  127. let goodLabel = UILabel.createLabel(text: config.goodText,font: .font(size: 16,weight: .medium),textColor: .white,numberOfLines: 0)
  128. popupContentView.addSubview(goodLabel)
  129. goodLabel.snp.makeConstraints { make in
  130. make.top.equalTo(titleLabel.snp.bottom).offset(28)
  131. make.leading.equalTo(32)
  132. make.trailing.equalTo(-32)
  133. }
  134. let goodInfoLabel = UILabel.createLabel(text: config.goodInfoText,font: .font(size: 14),textColor: .white.withAlphaComponent(0.6),numberOfLines: 0)
  135. popupContentView.addSubview(goodInfoLabel)
  136. goodInfoLabel.snp.makeConstraints { make in
  137. make.top.equalTo(goodLabel.snp.bottom).offset(8)
  138. make.leading.equalTo(32)
  139. make.trailing.equalTo(-32)
  140. }
  141. let goodImageView = UIImageView.createImageView(imageName: config.goodImageNamed)
  142. popupContentView.addSubview(goodImageView)
  143. goodImageView.snp.makeConstraints { make in
  144. make.top.equalTo(goodInfoLabel.snp.bottom).offset(12)
  145. make.leading.equalTo(32)
  146. make.trailing.equalTo(-32)
  147. make.height.equalTo(108*kDesignScale)
  148. }
  149. let badLabel = UILabel.createLabel(text: config.badText,font: .font(size: 16,weight: .medium),textColor: .white,numberOfLines: 0)
  150. popupContentView.addSubview(badLabel)
  151. badLabel.snp.makeConstraints { make in
  152. make.top.equalTo(goodImageView.snp.bottom).offset(28)
  153. make.leading.equalTo(32)
  154. make.trailing.equalTo(-32)
  155. }
  156. let badInfoLabel = UILabel.createLabel(text: config.badInfoText,font: .font(size: 14),textColor: .white.withAlphaComponent(0.6),numberOfLines: 0)
  157. popupContentView.addSubview(badInfoLabel)
  158. badInfoLabel.snp.makeConstraints { make in
  159. make.top.equalTo(badLabel.snp.bottom).offset(8)
  160. make.leading.equalTo(32)
  161. make.trailing.equalTo(-32)
  162. }
  163. let badImageView = UIImageView.createImageView(imageName: config.badImageNamed)
  164. popupContentView.addSubview(badImageView)
  165. badImageView.snp.makeConstraints { make in
  166. make.top.equalTo(badInfoLabel.snp.bottom).offset(12)
  167. make.leading.equalTo(32)
  168. make.trailing.equalTo(-32)
  169. make.height.equalTo(108*kDesignScale)
  170. }
  171. popupContentView.addSubview(submitBtn)
  172. submitBtn.snp.makeConstraints { make in
  173. make.top.equalTo(badImageView.snp.bottom).offset(35)
  174. make.centerX.equalToSuperview()
  175. make.width.equalTo(250*kDesignScale)
  176. make.height.equalTo(48)
  177. make.bottom.equalTo(-24)
  178. }
  179. }
  180. static var isShowUploadImageHint:Bool{
  181. get {
  182. return UserDefaults.standard.string(forKey: userDefaultsKey) == nil
  183. }
  184. set {
  185. UserDefaults.standard.set(newValue ? nil : "1", forKey: userDefaultsKey)
  186. UserDefaults.standard.synchronize()
  187. }
  188. }
  189. func pickSinglePhoto() {
  190. self.submitBtn.isUserInteractionEnabled = false
  191. photoPickerManager.pickCustomSinglePhoto() { [weak self] image, errorString in
  192. guard let self = self else { return }
  193. self.submitBtn.isUserInteractionEnabled = true
  194. if let errorString = errorString {
  195. TSToastShared.showToast(text: errorString)
  196. }else{
  197. self.clickUpImageHandle?(image)
  198. }
  199. }
  200. }
  201. func dismissPageVC(){
  202. self.view.isHidden = true
  203. self.photoPickerManager.dismissPageVC()
  204. self.dismiss()
  205. }
  206. }