TSAIListHintBaseVC.swift 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  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 enhanceConfig:Config {
  37. return Config(imageMaxBitSize: kUploadImageMaxBit5Size,
  38. goodImageNamed: "hint_Enhance_good",
  39. badImageNamed: "hint_Enhance_bad",
  40. titleText: "Enhance Tips".localized,
  41. titleSubText: "",
  42. goodText: "Suitable".localized,
  43. goodInfoText: "Portraits, Low-resolution and photos, faces should be visible".localized,
  44. badText: "Unsuitable".localized,
  45. badInfoText: "High resulotion, Severaly damaged and Difficult to recognize the face".localized)
  46. }
  47. static var colorizeConfig:Config {
  48. return Config(imageMaxBitSize: kUploadImageMaxBit10Size,
  49. goodImageNamed: "hint_Colorize_good",
  50. badImageNamed: "hint_Colorize_bad",
  51. titleText: "Colorize Tips".localized,
  52. titleSubText: "",
  53. goodText: "Suitable".localized,
  54. goodInfoText: "Clear outline black-and-white photos".localized,
  55. badText: "Unsuitable".localized,
  56. badInfoText: "Colorful or Severely damaged photos".localized)
  57. }
  58. static var descratchConfig:Config {
  59. return Config(imageMaxBitSize: kUploadImageMaxBit10Size,
  60. goodImageNamed: "hint_Descratch_good",
  61. badImageNamed: "hint_Descratch_bad",
  62. titleText: "Descratch Tips".localized,
  63. titleSubText: "",
  64. goodText: "Suitable".localized,
  65. goodInfoText: "Scratched and Damaged photos".localized,
  66. badText: "Unsuitable".localized,
  67. badInfoText: "High-resolution, Not damaged, and Clear photos".localized)
  68. }
  69. }
  70. var config:Config = Config.enhanceConfig
  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 = .clear
  83. return popupContentView
  84. }()
  85. lazy var photoPickerManager: TSPhotoPickerManager = {
  86. let photoPickerManager = TSPhotoPickerManager(viewController: self)
  87. return photoPickerManager
  88. }()
  89. lazy var submitBtn: UIButton = {
  90. let submitBtn = kCreateNormalSubmitBtn(title: "Upload Photo".localized) { [weak self] in
  91. guard let self = self else { return }
  92. pickSinglePhoto()
  93. }
  94. return submitBtn
  95. }()
  96. override func createView() {
  97. addNormalNavBarView()
  98. _ = setNavigationItem("", imageName: "ic-close", direction: .right, action: #selector(clickView))
  99. view.backgroundColor = .mainBg
  100. contentView.addSubview(popupContentView)
  101. popupContentView.center = view.center
  102. popupContentView.snp.makeConstraints { make in
  103. make.top.equalTo(0)
  104. make.bottom.equalTo(0)
  105. make.leading.equalTo(28)
  106. make.trailing.equalTo(-28)
  107. }
  108. setUpUI()
  109. }
  110. @objc func clickView() {
  111. PlayerManager.shared.miniBar.isHidden = false
  112. dismiss(animated: true)
  113. }
  114. func setUpUI(){
  115. let iconImageView:UIImageView = UIImageView.createImageView(image: .hint)
  116. popupContentView.addSubview(iconImageView)
  117. iconImageView.snp.makeConstraints { make in
  118. make.top.equalTo(16)
  119. make.leading.equalTo(0)
  120. make.width.height.equalTo(40)
  121. }
  122. let fullText = config.titleText+config.titleSubText
  123. let attString = NSMutableAttributedString(string: fullText)
  124. // let mainRange = NSRange(location: 0, length: config.titleText.count)
  125. attString.addAttributes([.font:UIFont.font(name:.ZillaSlabBold ,size: 26,weight: .bold),.foregroundColor:UIColor.white], range: NSRange(location: 0, length: config.titleText.count))
  126. attString.addAttributes([.font:UIFont.font(size: 12),.foregroundColor:UIColor.white.withAlphaComponent(0.6)], range: NSRange(location: config.titleText.count, length: config.titleSubText.count))
  127. let titleLabel = UILabel.createLabel(numberOfLines: 0)
  128. titleLabel.attributedText = attString
  129. popupContentView.addSubview(titleLabel)
  130. titleLabel.snp.makeConstraints { make in
  131. make.leading.equalTo(0)
  132. make.top.equalTo(iconImageView.snp.bottom).offset(24)
  133. }
  134. let goodImageView = UIImageView.createImageView(imageName: config.goodImageNamed)
  135. popupContentView.addSubview(goodImageView)
  136. goodImageView.snp.makeConstraints { make in
  137. make.top.equalTo(titleLabel.snp.bottom).offset(32)
  138. make.leading.equalTo(0)
  139. make.trailing.equalTo(0)
  140. make.height.equalTo(112*kDesignScale)
  141. }
  142. let goodLabel = UILabel.createLabel(text: config.goodText,font: .font(size: 16,weight: .medium),textColor: .white,numberOfLines: 0)
  143. popupContentView.addSubview(goodLabel)
  144. goodLabel.snp.makeConstraints { make in
  145. make.top.equalTo(goodImageView.snp.bottom).offset(12)
  146. make.leading.equalTo(0)
  147. make.trailing.equalTo(0)
  148. }
  149. let goodInfoLabel = UILabel.createLabel(text: config.goodInfoText,font: .font(size: 14),textColor: .white.withAlphaComponent(0.6),numberOfLines: 0)
  150. popupContentView.addSubview(goodInfoLabel)
  151. goodInfoLabel.snp.makeConstraints { make in
  152. make.top.equalTo(goodLabel.snp.bottom).offset(8)
  153. make.leading.equalTo(0)
  154. make.trailing.equalTo(0)
  155. }
  156. let badImageView = UIImageView.createImageView(imageName: config.badImageNamed)
  157. popupContentView.addSubview(badImageView)
  158. badImageView.snp.makeConstraints { make in
  159. make.top.equalTo(goodInfoLabel.snp.bottom).offset(20)
  160. make.leading.equalTo(0)
  161. make.trailing.equalTo(0)
  162. make.height.equalTo(112*kDesignScale)
  163. }
  164. let badLabel = UILabel.createLabel(text: config.badText,font: .font(size: 16,weight: .medium),textColor: .white,numberOfLines: 0)
  165. popupContentView.addSubview(badLabel)
  166. badLabel.snp.makeConstraints { make in
  167. make.top.equalTo(badImageView.snp.bottom).offset(12)
  168. make.leading.equalTo(0)
  169. make.trailing.equalTo(0)
  170. }
  171. let badInfoLabel = UILabel.createLabel(text: config.badInfoText,font: .font(size: 14),textColor: .white.withAlphaComponent(0.6),numberOfLines: 0)
  172. popupContentView.addSubview(badInfoLabel)
  173. badInfoLabel.snp.makeConstraints { make in
  174. make.top.equalTo(badLabel.snp.bottom).offset(8)
  175. make.leading.equalTo(0)
  176. make.trailing.equalTo(0)
  177. }
  178. popupContentView.addSubview(submitBtn)
  179. submitBtn.snp.makeConstraints { make in
  180. make.centerX.equalToSuperview()
  181. make.width.equalTo(248*kDesignScale)
  182. make.height.equalTo(48)
  183. make.bottom.equalTo(-43-k_Height_safeAreaInsetsBottom())
  184. }
  185. }
  186. static var isShowUploadImageHint:Bool{
  187. get {
  188. return UserDefaults.standard.string(forKey: userDefaultsKey) == nil
  189. }
  190. set {
  191. UserDefaults.standard.set(newValue ? nil : "1", forKey: userDefaultsKey)
  192. UserDefaults.standard.synchronize()
  193. }
  194. }
  195. func pickSinglePhoto() {
  196. self.submitBtn.isUserInteractionEnabled = false
  197. photoPickerManager.pickCustomSinglePhoto() { [weak self] image, errorString in
  198. guard let self = self else { return }
  199. self.submitBtn.isUserInteractionEnabled = true
  200. if let errorString = errorString {
  201. TSToastShared.showToast(text: errorString)
  202. }else{
  203. self.clickUpImageHandle?(image)
  204. }
  205. }
  206. }
  207. func dismissPageVC(){
  208. self.view.isHidden = true
  209. self.photoPickerManager.dismissPageVC()
  210. self.dismiss(animated: true)
  211. }
  212. }