TSAIListHintBaseVC.swift 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  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. static var enlightenConfig:Config {
  70. return Config(imageMaxBitSize: kUploadImageMaxBit10Size,
  71. goodImageNamed: "hint_Enlighten_good",
  72. badImageNamed: "hint_Enlighten_bad",
  73. titleText: "Enlighten Tips".localized,
  74. titleSubText: "",
  75. goodText: "Suitable".localized,
  76. goodInfoText: "Over-dark or over-light, overexposed, or underexposed photos".localized,
  77. badText: "Unsuitable".localized,
  78. badInfoText: "Well-exposed or severely damaged photos".localized)
  79. }
  80. static var recreateConfig:Config {
  81. return Config(imageMaxBitSize: kUploadImageMaxBit10Size,
  82. goodImageNamed: "hint_Descratch_good",
  83. badImageNamed: "hint_Enhance_bad",
  84. titleText: "Recreate Tips".localized,
  85. titleSubText: "",
  86. goodText: "Suitable".localized,
  87. goodInfoText: "Portraits, Low-resolution and photos, faces should be visible".localized,
  88. badText: "Unsuitable".localized,
  89. badInfoText: "High resulotion, Severaly damaged and Difficult to recognize the face".localized)
  90. }
  91. }
  92. var config:Config = Config.enhanceConfig
  93. init(config: Config, clickUpImageHandle: ((UIImage?) -> Void)? = nil) {
  94. self.config = config
  95. self.clickUpImageHandle = clickUpImageHandle
  96. super.init()
  97. }
  98. @MainActor required init?(coder: NSCoder) {
  99. fatalError("init(coder:) has not been implemented")
  100. }
  101. var clickUpImageHandle:((UIImage?)->Void)?
  102. lazy var popupContentView: UIView = {
  103. let popupContentView = UIView()
  104. popupContentView.backgroundColor = .clear
  105. return popupContentView
  106. }()
  107. lazy var photoPickerManager: TSPhotoPickerManager = {
  108. let photoPickerManager = TSPhotoPickerManager(viewController: self)
  109. return photoPickerManager
  110. }()
  111. lazy var submitBtn: UIButton = {
  112. let submitBtn = kCreateNormalSubmitBtn(title: "Upload Photo".localized) { [weak self] in
  113. guard let self = self else { return }
  114. pickSinglePhoto()
  115. }
  116. return submitBtn
  117. }()
  118. override func createView() {
  119. addNormalNavBarView()
  120. _ = setNavigationItem("", imageName: "ic-close", direction: .right, action: #selector(clickView))
  121. view.backgroundColor = .mainBg
  122. contentView.addSubview(popupContentView)
  123. popupContentView.center = view.center
  124. popupContentView.snp.makeConstraints { make in
  125. make.top.equalTo(0)
  126. make.bottom.equalTo(0)
  127. make.leading.equalTo(28)
  128. make.trailing.equalTo(-28)
  129. }
  130. setUpUI()
  131. }
  132. @objc func clickView() {
  133. dismiss(animated: true)
  134. }
  135. func setUpUI(){
  136. let iconImageView:UIImageView = UIImageView.createImageView(image: .hint)
  137. popupContentView.addSubview(iconImageView)
  138. iconImageView.snp.makeConstraints { make in
  139. make.top.equalTo(16)
  140. make.leading.equalTo(0)
  141. make.width.height.equalTo(40)
  142. }
  143. let fullText = config.titleText+config.titleSubText
  144. let attString = NSMutableAttributedString(string: fullText)
  145. // let mainRange = NSRange(location: 0, length: config.titleText.count)
  146. attString.addAttributes([.font:UIFont.font(name:.ZillaSlab ,size: 26,weight: .bold),.foregroundColor:UIColor.white], range: NSRange(location: 0, length: config.titleText.count))
  147. attString.addAttributes([.font:UIFont.font(size: 12),.foregroundColor:UIColor.white.withAlphaComponent(0.6)], range: NSRange(location: config.titleText.count, length: config.titleSubText.count))
  148. let titleLabel = UILabel.createLabel(numberOfLines: 0)
  149. titleLabel.attributedText = attString
  150. popupContentView.addSubview(titleLabel)
  151. titleLabel.snp.makeConstraints { make in
  152. make.leading.equalTo(0)
  153. make.top.equalTo(iconImageView.snp.bottom).offset(24)
  154. }
  155. let goodImageView = UIImageView.createImageView(imageName: config.goodImageNamed)
  156. popupContentView.addSubview(goodImageView)
  157. goodImageView.snp.makeConstraints { make in
  158. make.top.equalTo(titleLabel.snp.bottom).offset(32)
  159. make.leading.equalTo(0)
  160. make.trailing.equalTo(0)
  161. make.height.equalTo(112*kDesignScale)
  162. }
  163. let goodLabel = UILabel.createLabel(text: config.goodText,font: .font(size: 16,weight: .medium),textColor: .white,numberOfLines: 0)
  164. popupContentView.addSubview(goodLabel)
  165. goodLabel.snp.makeConstraints { make in
  166. make.top.equalTo(goodImageView.snp.bottom).offset(12)
  167. make.leading.equalTo(0)
  168. make.trailing.equalTo(0)
  169. }
  170. let goodInfoLabel = UILabel.createLabel(text: config.goodInfoText,font: .font(size: 14),textColor: .white.withAlphaComponent(0.6),numberOfLines: 0)
  171. popupContentView.addSubview(goodInfoLabel)
  172. goodInfoLabel.snp.makeConstraints { make in
  173. make.top.equalTo(goodLabel.snp.bottom).offset(8)
  174. make.leading.equalTo(0)
  175. make.trailing.equalTo(0)
  176. }
  177. let badImageView = UIImageView.createImageView(imageName: config.badImageNamed)
  178. popupContentView.addSubview(badImageView)
  179. badImageView.snp.makeConstraints { make in
  180. make.top.equalTo(goodInfoLabel.snp.bottom).offset(20)
  181. make.leading.equalTo(0)
  182. make.trailing.equalTo(0)
  183. make.height.equalTo(112*kDesignScale)
  184. }
  185. let badLabel = UILabel.createLabel(text: config.badText,font: .font(size: 16,weight: .medium),textColor: .white,numberOfLines: 0)
  186. popupContentView.addSubview(badLabel)
  187. badLabel.snp.makeConstraints { make in
  188. make.top.equalTo(badImageView.snp.bottom).offset(12)
  189. make.leading.equalTo(0)
  190. make.trailing.equalTo(0)
  191. }
  192. let badInfoLabel = UILabel.createLabel(text: config.badInfoText,font: .font(size: 14),textColor: .white.withAlphaComponent(0.6),numberOfLines: 0)
  193. popupContentView.addSubview(badInfoLabel)
  194. badInfoLabel.snp.makeConstraints { make in
  195. make.top.equalTo(badLabel.snp.bottom).offset(8)
  196. make.leading.equalTo(0)
  197. make.trailing.equalTo(0)
  198. }
  199. popupContentView.addSubview(submitBtn)
  200. submitBtn.snp.makeConstraints { make in
  201. make.centerX.equalToSuperview()
  202. make.width.equalTo(248*kDesignScale)
  203. make.height.equalTo(48)
  204. make.bottom.equalTo(-43-k_Height_safeAreaInsetsBottom())
  205. }
  206. }
  207. static var isShowUploadImageHint:Bool{
  208. get {
  209. return UserDefaults.standard.string(forKey: userDefaultsKey) == nil
  210. }
  211. set {
  212. UserDefaults.standard.set(newValue ? nil : "1", forKey: userDefaultsKey)
  213. UserDefaults.standard.synchronize()
  214. }
  215. }
  216. func pickSinglePhoto() {
  217. photoPickerManager.pickCustomSinglePhoto() { [weak self] image, errorString in
  218. guard let self = self else { return }
  219. if let errorString = errorString {
  220. TSToastShared.showToast(text: errorString)
  221. }else{
  222. self.clickUpImageHandle?(image)
  223. }
  224. }
  225. }
  226. func dismissPageVC(){
  227. self.view.isHidden = true
  228. self.photoPickerManager.dismissPageVC()
  229. self.dismiss(animated: true)
  230. }
  231. }