TSAIUploadPhotoBaseVC.swift 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. //
  2. // TSAIUploadPhotoBaseVC.swift
  3. // AIEmoji
  4. //
  5. // Created by 100Years on 2025/4/9.
  6. //
  7. import PhotosUI
  8. enum TSGeneratorImageStyle {
  9. case ageOld //变老
  10. case ageChild //变年轻
  11. case oldPhoto //旧照片修复
  12. case eyeOpen //开眼
  13. case pretty //变美
  14. case photoLive //把照片变活
  15. }
  16. class TSAIUploadPhotoBaseVC: TSBaseVC {
  17. var generatorStyle:TSGeneratorImageStyle
  18. var titleString:String
  19. var imageMaxBitSize:Int
  20. init(titleString:String,upLoadImage:UIImage,imageMaxBitSize:Int,generatorStyle:TSGeneratorImageStyle) {
  21. self.titleString = titleString
  22. self.upLoadImage = upLoadImage
  23. self.imageMaxBitSize = imageMaxBitSize
  24. self.generatorStyle = generatorStyle
  25. super.init()
  26. }
  27. @MainActor required init?(coder: NSCoder) {
  28. fatalError("init(coder:) has not been implemented")
  29. }
  30. //#####################################数据区#####################################
  31. let lineSpacing = 6.0
  32. lazy var photoPickerManager: TSPhotoPickerManager = {
  33. let photoPickerManager = TSPhotoPickerManager(viewController: self)
  34. return photoPickerManager
  35. }()
  36. //#####################################底部基础#####################################
  37. lazy var cusStackView: TSCustomStackView = {
  38. let cusStackView = TSCustomStackView(axis: .vertical,spacing: 0)
  39. return cusStackView
  40. }()
  41. lazy var submitBtn: UIButton = {
  42. let submitBtn = kCreateNormalSubmitBtn(title: generatingText) { [weak self] in
  43. guard let self = self else { return }
  44. generateImage()
  45. }
  46. submitBtn.cornerRadius = 24.0
  47. return submitBtn
  48. }()
  49. //#####################################上传 view#####################################
  50. var upLoadImage:UIImage? = nil {
  51. didSet{
  52. if let image = upLoadImage {
  53. upLoadView.isHidden = true
  54. uploadImageView.isHidden = false
  55. deleteBtn.isHidden = false
  56. uploadImageView.image = image
  57. submitBtn.isEnabled = true
  58. }else {
  59. upLoadView.isHidden = false
  60. uploadImageView.isHidden = true
  61. deleteBtn.isHidden = true
  62. uploadImageView.image = nil
  63. submitBtn.isEnabled = false
  64. }
  65. }
  66. }
  67. lazy var upLoadView: UIView = {
  68. let bgView = UIView()
  69. let addImageView = UIImageView.createImageView(imageName: "add")
  70. bgView.addSubview(addImageView)
  71. addImageView.snp.makeConstraints { make in
  72. make.top.equalTo(0)
  73. make.centerX.equalToSuperview()
  74. make.width.height.equalTo(24)
  75. }
  76. let textLabel = UILabel.createLabel(text: "Upload Photo".localized,font: .font(size: 16),textColor: .white)
  77. bgView.addSubview(textLabel)
  78. textLabel.snp.makeConstraints { make in
  79. make.top.equalTo(addImageView.snp.bottom).offset(16)
  80. make.centerX.equalToSuperview()
  81. make.bottom.equalToSuperview()
  82. }
  83. return bgView
  84. }()
  85. lazy var uploadImageView: UIImageView = {
  86. let uploadImageView = UIImageView()
  87. uploadImageView.contentMode = .scaleAspectFit
  88. uploadImageView.cornerRadius = 12
  89. return uploadImageView
  90. }()
  91. lazy var uploadImageBgView: UIView = {
  92. let bgView = UIView()
  93. bgView.addGestureRecognizer(UITapGestureRecognizer(target: self, action:#selector(clickBgView)))
  94. let bgImageView = UIImageView.createImageView(imageName: "ailist_upload_big_bg")
  95. bgImageView.contentMode = .scaleToFill
  96. bgView.addSubview(bgImageView)
  97. bgImageView.snp.makeConstraints { make in
  98. make.leading.bottom.trailing.top.equalTo(0)
  99. }
  100. bgView.addSubview(upLoadView)
  101. upLoadView.snp.makeConstraints { make in
  102. make.top.equalTo(244*kDesignScale)
  103. make.centerX.equalToSuperview()
  104. }
  105. bgView.addSubview(uploadImageView)
  106. uploadImageView.snp.makeConstraints { make in
  107. make.top.leading.equalTo(8)
  108. make.bottom.trailing.equalTo(-8)
  109. }
  110. return bgView
  111. }()
  112. lazy var deleteBtn: UIButton = {
  113. let deleteBtn = UIButton.createButton(backgroundImage: UIImage(named: "delete_redRound")) { [weak self] in
  114. guard let self = self else { return }
  115. upLoadImage = nil
  116. }
  117. deleteBtn.isHidden = true
  118. return deleteBtn
  119. }()
  120. override func createView() {
  121. addNormalNavBarView()
  122. setPageTitle(titleString)
  123. _ = setNavigationItem("", imageName: "aichat_history", direction: .right, action: #selector(clickNavRight))
  124. contentView.addSubview(submitBtn)
  125. submitBtn.snp.makeConstraints { make in
  126. make.centerX.equalToSuperview()
  127. make.width.equalTo(250*kDesignScale)
  128. make.height.equalTo(48)
  129. make.bottom.equalTo(-10-k_Height_safeAreaInsetsBottom())
  130. }
  131. contentView.addSubview(cusStackView)
  132. cusStackView.snp.makeConstraints { make in
  133. make.top.equalTo(0)
  134. make.leading.trailing.equalToSuperview()
  135. make.bottom.equalTo(submitBtn.snp.top).offset(-10)
  136. }
  137. setUpStackView()
  138. let image = upLoadImage
  139. upLoadImage = image
  140. }
  141. override func dealThings() {
  142. kSetBtnVipIcon(btn: self.submitBtn, show: true)
  143. }
  144. }
  145. extension TSAIUploadPhotoBaseVC {
  146. func setUpStackView(){
  147. //添加上传一大块
  148. let bgView = UIView()
  149. bgView.addSubview(uploadImageBgView)
  150. cusStackView.addSubviewToStack(bgView)
  151. uploadImageBgView.snp.makeConstraints { make in
  152. make.width.equalTo(296*kDesignScale)
  153. make.height.equalTo(528*kDesignScale)
  154. make.centerX.equalToSuperview()
  155. make.top.equalTo(8)
  156. make.bottom.equalTo(-16)
  157. }
  158. bgView.addSubview(deleteBtn)
  159. deleteBtn.snp.makeConstraints { make in
  160. make.top.equalTo(0)
  161. make.trailing.equalTo(-32*kDesignScale)
  162. make.width.height.equalTo(32)
  163. }
  164. //文字信息区域
  165. cusStackView.addSubviewToStack(getTextInfoCell(text: "Single photo with face fully visible".localized))
  166. cusStackView.addSpacing(height: lineSpacing)
  167. cusStackView.addSubviewToStack(getTextInfoCell(text: "No group photos, covered faces, nudes".localized))
  168. }
  169. func getTextInfoCell(text:String) -> UIView {
  170. let bgView = UIView()
  171. let pointView = UIView()
  172. pointView.backgroundColor = .white.withAlphaComponent(0.7)
  173. pointView.cornerRadius = 1
  174. bgView.addSubview(pointView)
  175. pointView.snp.makeConstraints { make in
  176. make.top.equalTo(7)
  177. make.leading.equalTo(22)
  178. make.width.height.equalTo(2)
  179. }
  180. let textLabel1 = UILabel.createLabel(text: text,font: .font(size: 12),textColor: .white.withAlphaComponent(0.6),numberOfLines: 0)
  181. textLabel1.setLineSpacing(lineSpacing)
  182. bgView.addSubview(textLabel1)
  183. textLabel1.snp.makeConstraints { make in
  184. make.top.bottom.equalToSuperview()
  185. make.leading.equalTo(16+16)
  186. make.trailing.equalTo(-16)
  187. }
  188. return bgView
  189. }
  190. var generatingText:String{
  191. if generatorStyle == .oldPhoto {
  192. return "Restore".localized
  193. }else
  194. if generatorStyle == .pretty {
  195. return "Change".localized
  196. }
  197. return "Generate".localized
  198. }
  199. }
  200. extension TSAIUploadPhotoBaseVC {
  201. @objc func clickNavRight() {
  202. kPushVC(target: self, modelVC: TSAIListHistoryBaseVC(generatorStyle: generatorStyle))
  203. }
  204. @objc func clickBgView() {
  205. pickSinglePhoto()
  206. }
  207. func pickSinglePhoto() {
  208. // photoPickerManager.pickSinglePhoto(maxBitSize: imageMaxBitSize) { [weak self] image, errorString in
  209. photoPickerManager.pickCustomSinglePhoto() { [weak self] image, errorString in
  210. guard let self = self else { return }
  211. if let errorString = errorString {
  212. TSToastShared.showToast(text: errorString)
  213. }else{
  214. upLoadImage = image
  215. }
  216. }
  217. }
  218. }
  219. extension TSAIUploadPhotoBaseVC {
  220. func generateImage() {
  221. if kJudgeVip(externalBool: true, vc: self){ return } //判断 vip
  222. guard let upLoadImage = upLoadImage else { return }
  223. let gennerateVC = TSAIListPhotoGeneratorBaseVC(upLoadImage: upLoadImage, generatorStyle: generatorStyle) { [weak self] model in
  224. guard let self = self else { return }
  225. saveModel(model: model)
  226. }
  227. kPresentModalVC(target: self, modelVC: gennerateVC,transitionStyle: .crossDissolve)
  228. }
  229. func saveModel(model:TSActionInfoModel){
  230. switch generatorStyle {
  231. case .ageOld:
  232. TSChangeOldAgeHistory.shared.saveModel(model: model)
  233. case .ageChild:
  234. TSChangeBabyAgeHistory.shared.saveModel(model: model)
  235. case .oldPhoto:
  236. TSChangeOldPhotoHistory.shared.saveModel(model: model)
  237. case .eyeOpen:
  238. TSAIEyeOpenHistory.shared.saveModel(model: model)
  239. case .pretty:
  240. TSAIPhotoPrettyHistory.shared.saveModel(model: model)
  241. case .photoLive:
  242. TSAIPhotoLiveHistory.shared.saveModel(model: model)
  243. }
  244. }
  245. }