TSPhotoToPhotoVC.swift 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. //
  2. // TSPhotoToPhotoVC.swift
  3. // AIEmoji
  4. //
  5. // Created by 100Years on 2025/2/25.
  6. //
  7. class TSPhotoToPhotoVC: TSBaseVC {
  8. lazy var viewModel:TSPhotoToPhotoVM = {
  9. let vm = TSPhotoToPhotoVM()
  10. vm.isCanGennerateBlock = { [weak self] isCan in
  11. guard let self = self else { return }
  12. submitBtn.isEnabled = isCan
  13. }
  14. return vm
  15. }()
  16. //###################################### 导航栏 view ######################################
  17. lazy var vipBtn: UIButton = {
  18. let vipBtn = UIButton.createButton(image: UIImage(named: "nav_vip")) { [weak self] in
  19. guard let self = self else { return }
  20. TSPurchaseVC.show(target: self) {
  21. }
  22. }
  23. return vipBtn
  24. }()
  25. lazy var navBarView: TSBaseNavContentBarView = {
  26. let navBarView = TSBaseNavContentBarView()
  27. let titleImageView = UIImageView.createImageView(imageName: "nav_title_pic",contentMode: .scaleToFill)
  28. navBarView.barView.addSubview(titleImageView)
  29. titleImageView.snp.makeConstraints { make in
  30. make.centerY.equalToSuperview()
  31. make.left.equalTo(16)
  32. }
  33. let keyboardBtn = UIButton.createButton(image: UIImage(named: "keyboard")) { [weak self] in
  34. guard let self = self else { return }
  35. kPresentModalVC(target: self, modelVC: TSWallpaperVC())
  36. }
  37. navBarView.barView.addSubview(keyboardBtn)
  38. keyboardBtn.snp.makeConstraints { make in
  39. make.centerY.equalToSuperview()
  40. make.trailing.equalTo(-16)
  41. make.width.height.equalTo(24)
  42. }
  43. navBarView.barView.addSubview(vipBtn)
  44. vipBtn.snp.makeConstraints { make in
  45. make.centerY.equalToSuperview()
  46. make.trailing.equalTo(-60)
  47. make.width.height.equalTo(24)
  48. }
  49. return navBarView
  50. }()
  51. //###################################### 入口 view ######################################
  52. // lazy var bannerBtn: UIButton = {
  53. // let bannerBtn = UIButton.createButton(backgroundImage: UIImage(named: "ptp_banner"))
  54. // bannerBtn.addTarget(self, action: #selector(clickPTPEnterView), for: .touchUpInside)
  55. // bannerBtn.frame = CGRect(x: 16, y: 17, width: k_ScreenWidth-32, height: 117)
  56. // return bannerBtn
  57. // }()
  58. let bannerY:CGFloat = 17
  59. let bannerW:CGFloat = 166*kDesignScale
  60. let bannerH:CGFloat = 117*kDesignScale
  61. lazy var textToPhotoBannerBtn: UIButton = {
  62. let textToPhotoBannerBtn = UIButton.createButton(backgroundImage: UIImage(named: "textToPhoto_banner"))
  63. textToPhotoBannerBtn.addTarget(self, action: #selector(clickTextToPhoto), for: .touchUpInside)
  64. textToPhotoBannerBtn.frame = CGRect(x: 16, y: bannerY, width: bannerW, height: bannerH)
  65. let label = UILabel.createLabel(text: "Text ➡️ Photo".localized,font: .font(name:.PoppinsBlackItalic,size: 16),textColor: .white)
  66. textToPhotoBannerBtn.addSubview(label)
  67. label.snp.makeConstraints { make in
  68. make.top.equalTo(12)
  69. make.leading.equalTo(8)
  70. make.height.equalTo(24)
  71. }
  72. let button = UIButton.createButton(title:"Try Now".localized,backgroundColor:.white,font: .font(size: 11),titleColor: "#ED69AA".uiColor,corner: 9)
  73. button.contentEdgeInsets = UIEdgeInsets(top: 0, left: 6, bottom: 0, right: 6)
  74. textToPhotoBannerBtn.addSubview(button)
  75. button.snp.makeConstraints { make in
  76. make.top.equalTo(44)
  77. make.leading.equalTo(8)
  78. make.height.equalTo(18)
  79. }
  80. return textToPhotoBannerBtn
  81. }()
  82. lazy var textToEmojiBannerBtn: UIButton = {
  83. let textToEmojiBannerBtn = UIButton.createButton(backgroundImage: UIImage(named: "textToEmoji_banner"))
  84. textToEmojiBannerBtn.addTarget(self, action: #selector(clickTextToEmoji), for: .touchUpInside)
  85. let x = textToPhotoBannerBtn.x + textToPhotoBannerBtn.width + 11.0
  86. textToEmojiBannerBtn.frame = CGRect(x: x, y: bannerY, width: bannerW, height: bannerH)
  87. let color:UIColor = "#7855D6".uiColor
  88. let label = UILabel.createLabel(text: "Text ➡️ Emoji".localized,font: .font(name:.PoppinsBlackItalic,size: 16),textColor: color)
  89. textToEmojiBannerBtn.addSubview(label)
  90. label.snp.makeConstraints { make in
  91. make.top.equalTo(12)
  92. make.leading.equalTo(8)
  93. make.height.equalTo(24)
  94. }
  95. let button = UIButton.createButton(title:"Try Now".localized,backgroundColor:color,font: .font(size: 11),titleColor: "#D0D5FF".uiColor,corner: 9)
  96. button.contentEdgeInsets = UIEdgeInsets(top: 0, left: 6, bottom: 0, right: 6)
  97. textToEmojiBannerBtn.addSubview(button)
  98. button.snp.makeConstraints { make in
  99. make.top.equalTo(44)
  100. make.leading.equalTo(8)
  101. make.height.equalTo(18)
  102. }
  103. return textToEmojiBannerBtn
  104. }()
  105. let collectionViewBtootm:CGFloat = 80
  106. lazy var collectionComponent: TSCollectionViewComponent = {
  107. let layout = UICollectionViewFlowLayout()
  108. let cp = TSCollectionViewComponent(frame: CGRect.zero, layout: layout, attributes: [:])
  109. cp.collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: collectionViewBtootm, right: 0)
  110. //点击 cell中的某个按钮
  111. cp.itemActionHandler = { [weak self] cellCp, indexPath in
  112. guard let self = self else { return }
  113. if indexPath == IndexPath(item: 0, section: 0) {
  114. if let text = cellCp as? String{
  115. if text == "add" {//选择图片
  116. photoPickerManager.pickSinglePhoto { [weak self] image,phAsset in
  117. guard let self = self else { return }
  118. let maxSize = 10 * 1024 * 1024
  119. if let image = image,let phAsset = phAsset {
  120. // 方法2:异步获取详细大小(不阻塞主线程)
  121. TSPhotoSizeHelper.getImageFileSizeAsync(asset: phAsset) {[weak self] size in
  122. guard let self = self else { return }
  123. let mbSize = Double(size) / (1024 * 1024)
  124. print("精确大小: \(mbSize) MB,size = \(size)")
  125. if size > maxSize {
  126. TSToastShared.showToast(text: "Photo must be smaller than 10MB.".localized)
  127. }else{
  128. upDateUpLoadImage(image: image)
  129. }
  130. }
  131. }else if let image = image {
  132. if image.isLargerThan(byteSize: maxSize) {
  133. TSToastShared.showToast(text: "Photo must be smaller than 10MB.".localized)
  134. }else{
  135. upDateUpLoadImage(image: image)
  136. }
  137. }
  138. }
  139. }else if text == "delete"{//删除图片
  140. viewModel.upLoadImage = nil
  141. UIView.performWithoutAnimation {
  142. cp.collectionView.reloadSections(IndexSet(integer: 0))
  143. }
  144. }
  145. }
  146. }else if let model = cellCp as? TSGenerateStyleModel ,indexPath == IndexPath(item: 0, section: 1) {
  147. //选择了某个样式
  148. viewModel.selectedPTPStyleModel = model
  149. updateVipView()
  150. dePrint("selectedPTPStyleModel=\(model.toJSON())")
  151. }
  152. }
  153. cp.sectionActionHandler = { [weak self] cellCp, indexPath in
  154. guard let self = self else { return }
  155. if let cmd = cellCp as? String, cmd == "delete" {
  156. showCustomAlert(message: "Are you sure to delete".localized, deleteHandler: {
  157. self.viewModel.removeAllHistoryList()
  158. self.collectionComponent.clear()
  159. self.collectionComponent.reloadView(with: self.viewModel.colDataArray)
  160. })
  161. }
  162. }
  163. cp.itemDidSelectedHandler = { [weak self] (object, indexPath) in
  164. guard let self = self else { return }
  165. if indexPath.section == 0{
  166. return
  167. }
  168. if let sections = viewModel.colDataArray.safeObj(At: indexPath.section) as? TSGenmojiCoLSectionModel{
  169. var dataModelArray:[TSActionInfoModel] = []
  170. for itemModel in sections.items {
  171. dataModelArray.append(itemModel.dataModel)
  172. }
  173. let browseVC = TSAIPhotoBrowseVC()
  174. browseVC.dataModelArray = dataModelArray
  175. browseVC.currentIndex = indexPath.item
  176. kPresentModalVC(target: self, modelVC: browseVC,transitionStyle: .crossDissolve)
  177. }
  178. }
  179. return cp
  180. }()
  181. func upDateUpLoadImage(image:UIImage){
  182. viewModel.upLoadImage = image
  183. UIView.performWithoutAnimation {
  184. collectionComponent.collectionView.reloadSections(IndexSet(integer: 0))
  185. }
  186. }
  187. lazy var submitBtn: UIButton = {
  188. let submitBtn = kCreateNormalSubmitBtn(title: getVipText()) { [weak self] in
  189. guard let self = self else { return }
  190. uploadImage()
  191. }
  192. submitBtn.cornerRadius = 24.0
  193. submitBtn.isEnabled = false
  194. return submitBtn
  195. }()
  196. lazy var photoPickerManager: TSPhotoPickerManager = {
  197. let photoPickerManager = TSPhotoPickerManager(viewController: self)
  198. return photoPickerManager
  199. }()
  200. override func createView() {
  201. navBarContentView.addSubview(navBarView)
  202. navBarView.snp.makeConstraints { make in
  203. make.edges.equalToSuperview()
  204. }
  205. contentView.addSubview(collectionComponent.collectionView)
  206. collectionComponent.collectionView.snp.makeConstraints { make in
  207. make.edges.equalToSuperview()
  208. }
  209. collectionComponent.clear()
  210. collectionComponent.reloadView(with:viewModel.colDataArray)
  211. contentView.addSubview(submitBtn)
  212. submitBtn.snp.makeConstraints { make in
  213. make.bottom.equalTo(-k_Height_safeAreaInsetsBottom())
  214. make.leading.equalTo(16)
  215. make.trailing.equalTo(-16)
  216. make.height.equalTo(48)
  217. }
  218. // //顶部入口跳转按钮
  219. // let vcViewH = bannerBtn.frame.origin.y+bannerBtn.frame.size.height
  220. // collectionComponent.collectionView.addSubview(bannerBtn)
  221. // collectionComponent.collectionView.contentInset = UIEdgeInsets(top: vcViewH, left: 0, bottom: collectionViewBtootm, right: 0)
  222. // bannerBtn.y = -bannerBtn.frame.size.height
  223. //顶部入口跳转按钮
  224. let bannerBtn = textToPhotoBannerBtn
  225. let vcViewH = bannerBtn.frame.origin.y+bannerBtn.frame.size.height
  226. collectionComponent.collectionView.addSubview(bannerBtn)
  227. collectionComponent.collectionView.contentInset = UIEdgeInsets(top: vcViewH, left: 0, bottom: collectionViewBtootm, right: 0)
  228. bannerBtn.y = -bannerBtn.frame.size.height
  229. collectionComponent.collectionView.addSubview(textToEmojiBannerBtn)
  230. textToEmojiBannerBtn.y = bannerBtn.y
  231. }
  232. override func dealThings() {
  233. NotificationCenter.default.addObserver(self, selector: #selector(vipInfoChanged), name: .kPurchaseDidChanged, object: nil)
  234. updateVipView()
  235. }
  236. @objc func vipInfoChanged() {
  237. kExecuteOnMainThread {
  238. self.updateVipView()
  239. }
  240. }
  241. func updateVipView() {
  242. kExecuteOnMainThread {
  243. self.vipBtn.isHidden = PurchaseManager.default.isVip
  244. var showVip = kPurchaseDefault.generateVipShow(type: .picToPic)
  245. if showVip == false {
  246. showVip = self.viewModel.selectedPTPStyleModel?.isVip ?? false
  247. }
  248. kSetBtnVipIcon(btn: self.submitBtn, show: showVip)
  249. }
  250. }
  251. @objc func clickCollectionView() {
  252. view.endEditing(true)
  253. }
  254. }
  255. extension TSPhotoToPhotoVC {
  256. @objc func clickPTPEnterView() {
  257. kPushVC(target: self, modelVC: TSTextGeneralPictureVC())
  258. }
  259. @objc func clickTextToPhoto() {
  260. kPushVC(target: self, modelVC: TSTextGeneralPictureVC())
  261. }
  262. @objc func clickTextToEmoji() {
  263. kPushVC(target: self, modelVC: TSGenmojiVC())
  264. }
  265. func uploadImage(){
  266. generateImage()
  267. }
  268. func generateImage() {
  269. var isVip = kPurchaseDefault.freeNumAvailable(type: .picToPic) == false
  270. if viewModel.selectedPTPStyleModel?.isVip == true {
  271. isVip = true
  272. }
  273. //判断 vip
  274. if kJudgeVip(externalBool: isVip, vc: self) { [weak self] in
  275. guard let self = self else { return }
  276. }{ return }
  277. guard let selectedPTPStyleModel = viewModel.selectedPTPStyleModel else { return }
  278. guard let upLoadImage = viewModel.upLoadImage else { return }
  279. let gennerateVC = TSPTPGeneratorVC(prompt: selectedPTPStyleModel.prompt,promptSort: selectedPTPStyleModel.imageText , imageUrl: "",upLoadImage: upLoadImage,style: selectedPTPStyleModel.style) { [weak self] model in
  280. guard let self = self else { return }
  281. if viewModel.saveModel(model:model) {
  282. collectionComponent.clear()
  283. collectionComponent.reloadView(with:viewModel.colDataArray)
  284. }else{
  285. collectionComponent.reloadData()
  286. }
  287. updateVipView()
  288. }
  289. kPresentModalVC(target: self, modelVC: gennerateVC,transitionStyle: .crossDissolve)
  290. }
  291. func getVipText()->String{
  292. return "Generate".localized
  293. // if kPurchaseDefault.isVip {
  294. // return "Generate"
  295. // }
  296. // return "Generate (\(kPurchaseDefault.freeNum(type: .picToPic)))"
  297. }
  298. }