TSAIChangeEmoteVC.swift 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. //
  2. // TSAIChangeEmoteVC.swift
  3. // AIEmoji
  4. //
  5. // Created by 100Years on 2025/4/10.
  6. //
  7. import PhotosUI
  8. class TSAIChangeEmoteVC: TSBaseVC {
  9. enum Style {
  10. case changeEmote
  11. case changehairColor
  12. case changehair
  13. }
  14. lazy var viewModel: TSAIChangeEmoteVM = {
  15. let viewModel:TSAIChangeEmoteVM = TSAIChangeEmoteVM(style: style)
  16. return viewModel
  17. }()
  18. var upLoadImage:UIImage?{
  19. didSet{
  20. topImageView.image = upLoadImage
  21. }
  22. }
  23. var style:Style
  24. init(upLoadImage: UIImage,style:Style) {
  25. self.upLoadImage = upLoadImage
  26. self.style = style
  27. super.init()
  28. }
  29. @MainActor required init?(coder: NSCoder) {
  30. fatalError("init(coder:) has not been implemented")
  31. }
  32. lazy var photoPickerManager: TSPhotoPickerManager = {
  33. let photoPickerManager = TSPhotoPickerManager(viewController: self)
  34. return photoPickerManager
  35. }()
  36. //###################################### topImageView ######################################
  37. lazy var topImageView: UIImageView = {
  38. let imageView = UIImageView()
  39. imageView.isUserInteractionEnabled = true
  40. imageView.contentMode = .scaleAspectFit
  41. return imageView
  42. }()
  43. //###################################### style类型 ######################################
  44. var selectedmodel:TSGenerateStyleModel?
  45. lazy var styleView: TSAIChangeEmoteStyleView = {
  46. let styleView = TSAIChangeEmoteStyleView()
  47. styleView.dataArray = viewModel.selectStyleModels
  48. styleView.currentIndexPath = IndexPath(item: viewModel.selectedStyleIndex, section: 0)
  49. styleView.selectedValueBlock = { [weak self] model in
  50. guard let self = self else { return }
  51. selectedmodel = model
  52. handelSelectedValueBlock(model: model)
  53. }
  54. return styleView
  55. }()
  56. //###################################### 按钮 ######################################
  57. lazy var saveBtn: UIButton = {
  58. let btn = UIButton.createButton(title: "Save".localized,backgroundColor: .themeColor,font: .font(size: 12,weight: .medium),titleColor: "#111111".uiColor,corner: 14){ [weak self] in
  59. guard let self = self else { return }
  60. saveCurrentImage()
  61. }
  62. btn.contentEdgeInsets = UIEdgeInsets(top: 0, left: 25, bottom: 0, right: 25)
  63. return btn
  64. }()
  65. lazy var switchOriginalPictureBtn: TSUIExpandedTouchButton = {
  66. let switchOriginalPictureBtn = TSUIExpandedTouchButton()
  67. switchOriginalPictureBtn.setUpButton(image:UIImage(named: "switch_original_picture"))
  68. switchOriginalPictureBtn.addTarget(self, action: #selector(switchOriginalPictureTouchDown), for: .touchDown)
  69. switchOriginalPictureBtn.addTarget(self, action: #selector(switchOriginalPictureTouchUp), for: [.touchUpInside, .touchUpOutside, .touchCancel])
  70. switchOriginalPictureBtn.isHidden = true
  71. return switchOriginalPictureBtn
  72. }()
  73. lazy var generateInView : TSGeneratorView = {
  74. let generateInView = TSGeneratorView()
  75. generateInView.setBackgroundColor(color: UIColor.black.withAlphaComponent(0.8))
  76. generateInView.isHidden = true
  77. generateInView.animationView.setText(time: String(format: "~ %d seconds".localized, 20), info: "")
  78. generateInView.clickErrorBlock = { [weak self] style in
  79. guard let self = self else { return }
  80. switch style {
  81. case .netWorkError:
  82. if let selectedmodel = selectedmodel {
  83. handelSelectedValueBlock(model: selectedmodel)
  84. }
  85. case .generalError:
  86. generateInView.isHidden = true
  87. default:
  88. break
  89. }
  90. }
  91. return generateInView
  92. }()
  93. override func createView() {
  94. setUpView()
  95. view.addSubview(generateInView)
  96. generateInView.snp.makeConstraints { make in
  97. make.edges.equalToSuperview()
  98. }
  99. let image = upLoadImage
  100. upLoadImage = image
  101. viewModel.upLoadImage = image
  102. }
  103. override func dealThings() {
  104. viewModel.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self] (state,model) in
  105. guard let self = self else { return }
  106. self.upDateView(state: state, model: model)
  107. }.store(in: &cancellable)
  108. }
  109. override func navBarClickLeftAction() {
  110. if viewModel.isNeedSavePhoto{
  111. TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
  112. message: "You haven't saved the photo yet. Are you sure to quit?".localized,
  113. messageColor: .white,
  114. messageFont: .systemFont(ofSize: 16),
  115. cancelTitle: "Quit".localized,
  116. cancelColor: .white,
  117. confirmTitle: "Save".localized,
  118. confirmColor: .themeColor,
  119. cancelAction: { [weak self] in
  120. guard let self = self else { return }
  121. print("用户点击了Leave")
  122. pop()
  123. },
  124. confirmAction: { [weak self] in
  125. guard let self = self else { return }
  126. print("用户点击了Stay")
  127. saveCurrentImage()
  128. }
  129. ))
  130. }else{
  131. pop()
  132. }
  133. }
  134. }
  135. extension TSAIChangeEmoteVC {
  136. func setUpView() {
  137. addNormalNavBarView()
  138. setPageTitle("")
  139. normalNavBarView.barView.addSubview(saveBtn)
  140. saveBtn.snp.makeConstraints { make in
  141. make.centerY.equalToSuperview()
  142. make.trailing.equalTo(-16)
  143. make.height.equalTo(28)
  144. }
  145. contentView.addSubview(styleView)
  146. contentView.addSubview(topImageView)
  147. styleView.snp.makeConstraints { make in
  148. make.bottom.equalTo(-10-k_Height_safeAreaInsetsBottom())
  149. make.leading.trailing.equalTo(0)
  150. make.height.equalTo(100)
  151. }
  152. topImageView.snp.makeConstraints { make in
  153. make.bottom.equalTo(styleView.snp.top).offset(-10)
  154. make.leading.equalTo(0)
  155. make.trailing.equalTo(0)
  156. make.top.equalTo(0)
  157. }
  158. topImageView.addSubview(switchOriginalPictureBtn)
  159. switchOriginalPictureBtn.snp.makeConstraints { make in
  160. make.bottom.equalTo(-16)
  161. make.trailing.equalTo(-16)
  162. make.width.equalTo(40)
  163. make.height.equalTo(40)
  164. }
  165. }
  166. }
  167. extension TSAIChangeEmoteVC {
  168. func handelSelectedValueBlock(model:TSGenerateStyleModel) {
  169. switchOriginalPictureBtn.isHidden = true
  170. if model.clickType == 1 { //无类型
  171. topImageView.image = upLoadImage
  172. styleView.agreeWillSelectIndexPath()
  173. }else if model.clickType == 2 { //换图
  174. self.pickSinglePhoto()
  175. }else{
  176. if kJudgeVip(externalBool: true, vc: self){ return }//判断 vip
  177. viewModel.selectStyleModel = model
  178. viewModel.uploadAndCreatImage()
  179. }
  180. }
  181. @objc func uploadAndCreatImage() {
  182. if kJudgeVip(externalBool: true, vc: self){ return }//判断 vip
  183. viewModel.uploadAndCreatImage()
  184. }
  185. @objc func switchOriginalPictureTouchDown() {
  186. self.topImageView.image = upLoadImage
  187. }
  188. @objc func switchOriginalPictureTouchUp() {
  189. guard let selectStyleModel = viewModel.selectStyleModel else { return }
  190. guard let actionInfoModel = selectStyleModel.actionInfoModel else { return }
  191. self.topImageView.setAsyncImage(urlString: actionInfoModel.response.resultUrl,placeholder:upLoadImage)
  192. }
  193. }
  194. extension TSAIChangeEmoteVC {
  195. func pickSinglePhoto() {
  196. // photoPickerManager.pickSinglePhoto(maxBitSize: kUploadImageMaxBit10Size) { [weak self] image, errorString in
  197. photoPickerManager.pickCustomSinglePhoto() { [weak self] image, errorString in
  198. guard let self = self else { return }
  199. if let errorString = errorString {
  200. TSToastShared.showToast(text: errorString)
  201. }else{
  202. handlePhotoPicke(image: image)
  203. }
  204. }
  205. }
  206. func handlePhotoPicke(image:UIImage?){
  207. if let image = image {
  208. upLoadImage = image
  209. viewModel.upLoadImage = image
  210. styleView.currentIndexPath = IndexPath(item: 1, section: 0)
  211. }
  212. if upLoadImage == nil {
  213. pop()
  214. }
  215. }
  216. func saveCurrentImage(){
  217. if let img = topImageView.image, let image = img.pngImage{
  218. PhotoManagerShared.saveImageToAlbum(image) {[weak self] success, error in
  219. guard let self = self else { return }
  220. if success {
  221. viewModel.isSavePhotoMark = true
  222. kSaveSuccesswShared.show(atView:self.view)
  223. }else{
  224. debugPrint(error)
  225. }
  226. }
  227. }
  228. }
  229. }
  230. extension TSAIChangeEmoteVC {
  231. func upDateView(state:TSProgressState,model:TSActionInfoModel?){
  232. switch state {
  233. case .failed(let errorStr,let code):
  234. showError(text: errorStr,code:code)
  235. case .success:
  236. if let model = model {
  237. showSuccess(model: model)
  238. }else{
  239. showError(text: "")
  240. }
  241. case .progressString(let string):
  242. showProgress(text: string)
  243. case .none:
  244. generateInView.isHidden = true
  245. generateInView.isRotating = false
  246. default:
  247. showLoading()
  248. }
  249. }
  250. func showProgress(text:String) {
  251. generateInView.updateShowProgress(text: text)
  252. generateInView.xBtn.isHidden = true
  253. }
  254. func showLoading(){
  255. generateInView.updateShowLoading(text: "Generating".localized + " ...".localized)
  256. generateInView.xBtn.isHidden = true
  257. }
  258. func showError(text:String,code:Int = 0){
  259. generateInView.updateShowError(text: text,code: code)
  260. generateInView.xBtn.isHidden = false
  261. }
  262. func showSuccess(model:TSActionInfoModel){
  263. generateInView.updateShowSuccess()
  264. generateInView.xBtn.isHidden = true
  265. viewModel.selectStyleModel?.actionInfoModel = model
  266. self.topImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder:upLoadImage)
  267. styleView.agreeWillSelectIndexPath()
  268. }
  269. }