TSAIUploadPhotoVC.swift 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. //
  2. // TSAIUploadPhotoVC.swift
  3. // AIEmoji
  4. //
  5. // Created by 100Years on 2025/4/9.
  6. //
  7. import PhotosUI
  8. import BetterSegmentedControl
  9. class TSAIUploadPhotoVC: TSBaseVC {
  10. var generatorStyle:TSGeneratorImageStyle
  11. var titleString:String
  12. var disCoverItemModel:TSDiscoverItemModel?
  13. var generateModel:TSGenerateModel?
  14. var disCoverItemModels:[TSDiscoverItemModel]?
  15. var isUsedPhoto:Bool = false
  16. init(titleString:String,
  17. upLoadImage:UIImage,
  18. generatorStyle:TSGeneratorImageStyle,
  19. disCoverItemModel:TSDiscoverItemModel? = nil,
  20. disCoverItemModels:[TSDiscoverItemModel]? = nil,
  21. isUsedPhoto:Bool = false
  22. ) {
  23. self.titleString = titleString
  24. self.upLoadImage = upLoadImage
  25. self.generatorStyle = generatorStyle
  26. self.disCoverItemModel = disCoverItemModel
  27. self.generateModel = disCoverItemModel?.generateModel
  28. self.isUsedPhoto = isUsedPhoto
  29. self.disCoverItemModels = disCoverItemModels
  30. super.init()
  31. }
  32. @MainActor required init?(coder: NSCoder) {
  33. fatalError("init(coder:) has not been implemented")
  34. }
  35. var deleteComplete:(()->Void)?
  36. //###### UI ######
  37. lazy var cusStackView: TSCustomStackView = TSCustomStackView(axis: .vertical,spacing: 0)
  38. //上传区域
  39. lazy var upLoadView: UIView = creatUpLoadView()
  40. lazy var uploadImageView: UIImageView = creatUploadImageView()
  41. lazy var uploadImageBgView: UIView = creatUploadImageBgView()
  42. //提交 btn
  43. lazy var submitBtn: UIButton = creatSubmitBtn()
  44. //删除按钮
  45. lazy var deleteBtn: UIButton = creatDeleteBtn()
  46. //###### 视频区域 ######
  47. lazy var textView: TSAIUploadPhotoTextView = creatTextView()
  48. //更多样式区域
  49. lazy var styleBarView: TSAIUploadPhotoMoreStyleBarView = creatMoreStyleBarView()
  50. lazy var videoStyleBarView: TSAIUploadPhotoVideoStyleView = creatVideoStyleBarView()
  51. //###### 数据区 ######
  52. var uploadImageViewMaxHeight:CGFloat = k_ScreenHeight-76-k_Height_safeAreaInsetsBottom()-k_Nav_Height
  53. let lineSpacing = 6.0
  54. lazy var photoPickerManager: TSPhotoPickerManager = TSPhotoPickerManager(viewController: self)
  55. var hintBaseVC:TSAIListHintBaseVC = TSAIListHintBaseVC(config: .colorizeConfig)
  56. var upLoadImage:UIImage? = nil {
  57. didSet{
  58. if let image = upLoadImage {
  59. upLoadView.isHidden = true
  60. uploadImageView.isHidden = false
  61. deleteBtn.isHidden = false
  62. uploadImageView.image = image
  63. submitBtn.isEnabled = true
  64. }else {
  65. upLoadView.isHidden = false
  66. uploadImageView.isHidden = true
  67. deleteBtn.isHidden = true
  68. uploadImageView.image = nil
  69. submitBtn.isEnabled = false
  70. }
  71. updateUploadImageViewFrame()
  72. }
  73. }
  74. var additionalPrompt = ""
  75. override func createView() {
  76. addNormalNavBarView()
  77. setPageTitle(titleString)
  78. if isUsedPhoto {
  79. _ = setNavigationItem("", imageName: "ai_delete", direction: .right, action: #selector(clickNavDelete))
  80. }else{
  81. _ = setNavigationItem("", imageName: "replace_photo", direction: .right, action: #selector(clickNavRight))
  82. }
  83. let tap = UITapGestureRecognizer(target: self, action: #selector(clickView))
  84. tap.cancelsTouchesInView = false
  85. view.addGestureRecognizer(tap)
  86. contentView.addSubview(submitBtn)
  87. submitBtn.snp.makeConstraints { make in
  88. make.centerX.equalToSuperview()
  89. make.width.equalTo(250*kDesignScale)
  90. make.height.equalTo(48)
  91. make.bottom.equalTo(-12-k_Height_safeAreaInsetsBottom())
  92. }
  93. contentView.addSubview(cusStackView)
  94. cusStackView.snp.makeConstraints { make in
  95. make.top.equalTo(0)
  96. make.leading.trailing.equalToSuperview()
  97. // make.bottom.equalTo(submitBtn.snp.top).offset(-16)
  98. make.bottom.equalTo(submitBtn.snp.top)
  99. }
  100. setUpStackView()
  101. let image = upLoadImage
  102. upLoadImage = image
  103. }
  104. override func dealThings() {
  105. NotificationCenter.default.addObserver(self, selector: #selector(updateVipView), name: .kPurchaseDidChanged, object: nil)
  106. updateVipView()
  107. }
  108. @objc func updateVipView() {
  109. kMainAsync {
  110. kSetBtnVipIcon(btn: self.submitBtn, show: kPurchaseBusiness.generateVipShow(type: self.generatorStyle == .creatVideo ? .generalVideo :.general))
  111. }
  112. }
  113. func setUpStackView(){
  114. if let disCoverItemModels = self.disCoverItemModels,generatorStyle == .creatVideo{
  115. setUpVideoStyleBarView(discoverItemModels:disCoverItemModels)
  116. }else if let styleArray = getStyleArray(){
  117. setUpMoreStyleBarView(styleModels: styleArray)
  118. }else if generatorStyle == .creatVideo {
  119. setUpVideoUploadView()
  120. }else{
  121. setUpImageUploadView()
  122. }
  123. }
  124. func updateUploadImageViewFrame() {
  125. if let image = upLoadImage {
  126. let newSize = kGetSubFrame(superSize: CGSizeMake(k_ScreenWidth, uploadImageViewMaxHeight), subViewSize: image.size)
  127. uploadImageView.snp.remakeConstraints{ make in
  128. make.center.equalToSuperview()
  129. make.width.equalTo(newSize.width)
  130. make.height.equalTo(newSize.height)
  131. }
  132. }else{
  133. uploadImageView.snp.remakeConstraints { make in
  134. make.height.equalTo(k_ScreenWidth)
  135. make.center.equalToSuperview()
  136. make.width.equalTo(k_ScreenWidth)
  137. }
  138. }
  139. }
  140. func generateImage() {
  141. if kShowGenerateBusyView(view: WindowHelper.getCurrentWindow() ?? self.view,clickViewBlock: { [weak self] in
  142. guard let self = self else { return }
  143. self.navigationController?.popToRootViewController(animated: true)
  144. }) {
  145. return
  146. }
  147. if kPurchaseBusiness.kJudgeVipFreeType(vipFreeNumType: generatorStyle == .creatVideo ? .generalVideo : .general){ return }//判断 vip
  148. guard let upLoadImage = upLoadImage else { return }
  149. let generatorModel = TSAIListPhotoGeneratorModel(upLoadImage: upLoadImage, generatorStyle: generatorStyle,additionalPrompt: additionalPrompt)
  150. if let generateModel = generateModel{
  151. generatorModel.prompt = generateModel.prompt + additionalPrompt
  152. generatorModel.model = generateModel.model
  153. }else{
  154. if let promptModel = generatorStyle.generateModel{
  155. generatorModel.prompt = promptModel.prompt + additionalPrompt
  156. generatorModel.model = promptModel.model
  157. }
  158. }
  159. let gennerateVC = TSAIListPhotoGeneratorVC(generatorModel:generatorModel){[weak self] model in
  160. guard let self = self else { return }
  161. updateVipView()
  162. }
  163. gennerateVC.backstageBlock = { [weak self] in
  164. guard let self = self else { return }
  165. self.navigationController?.popToRootViewController(animated: false)
  166. }
  167. kPresentModalVC(target: self, modelVC: gennerateVC,transitionStyle: .crossDissolve)
  168. }
  169. }
  170. extension TSAIUploadPhotoVC {
  171. func setDeleteComplete(deleteComplete:@escaping ()->Void){
  172. self.deleteComplete = deleteComplete
  173. }
  174. @objc func clickNavDelete() {
  175. TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
  176. message: "Are you sure to delete?".localized,
  177. cancelTitle: "Delete".localized,
  178. cancelColor: .red,
  179. confirmTitle: "Retain".localized,
  180. confirmColor: .white,
  181. cancelAction: { [weak self] in
  182. guard let self = self else { return }
  183. self.deleteComplete?()
  184. self.pop()
  185. }
  186. ))
  187. }
  188. }
  189. extension TSAIUploadPhotoVC {
  190. @objc func clickView() {
  191. self.view.endEditing(true)
  192. }
  193. @objc func clickNavRight() {
  194. clickView()
  195. pickSinglePhoto()
  196. }
  197. @objc func clickBgView() {
  198. clickView()
  199. pickSinglePhoto()
  200. }
  201. func pickSinglePhoto() {
  202. pickSinglePhoto{ [weak self] image in
  203. guard let self = self else { return }
  204. upLoadImage = image
  205. }
  206. }
  207. }
  208. extension TSAIUploadPhotoVC {
  209. var prompt:String{
  210. if self.generatorStyle == .creatVideo {
  211. if additionalPrompt.isEmpty {
  212. return "Photo animation, Slight head turn, normal eye blinking, smile, realistic facial movement"
  213. }
  214. return additionalPrompt
  215. }
  216. return ""
  217. }
  218. }