TSDiscoverVC.swift 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. //
  2. // TSDiscoverVC.swift
  3. // AIEmoji
  4. //
  5. // Created by 100Years on 2025/6/23.
  6. //
  7. class TSDiscoverVC: TSBaseVC {
  8. let viewModel = kTSDiscoverVM
  9. var hintBaseVC:TSAIListHintBaseVC = TSAIListHintBaseVC(config: .defaultConfig)
  10. lazy var photoPickerManager: TSPhotoPickerManager = TSPhotoPickerManager(viewController: self)
  11. lazy var vipBtn: UIButton = {
  12. let vipBtn = UIButton.createButton(image: UIImage(named: "nav_vip")) { [weak self] in
  13. guard let self = self else { return }
  14. TSPurchaseVC.show(target: self) {}
  15. }
  16. return vipBtn
  17. }()
  18. lazy var navBarView: TSBaseNavContentBarView = {
  19. let navBarView = TSBaseNavContentBarView()
  20. let label = UILabel.createLabel(text: "Discover",font: .font(name: .KelsiFill,size: 28))
  21. navBarView.barView.addSubview(label)
  22. label.snp.makeConstraints { make in
  23. make.centerY.equalToSuperview()
  24. make.leading.equalTo(17.0)
  25. }
  26. navBarView.barView.addSubview(vipBtn)
  27. vipBtn.snp.makeConstraints { make in
  28. make.centerY.equalToSuperview()
  29. make.trailing.equalTo(-16)
  30. make.width.height.equalTo(32)
  31. }
  32. kMainAsync {
  33. label.applyGradient(colors: ["#FA794F".uiColor,"#F8C32A".uiColor,"#FEFBF4".uiColor])
  34. }
  35. return navBarView
  36. }()
  37. lazy var collectionView: TSBaseCollectionView = {
  38. let collectionViewLayout = UICollectionViewFlowLayout()
  39. let collectionView = TSBaseCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout)
  40. collectionView.delegate = self
  41. collectionView.dataSource = self
  42. for cases in TSDiscoverViewStyle.allCases {
  43. collectionView.register(cases.cell, forCellWithReuseIdentifier: String(describing: cases.cell))
  44. }
  45. collectionView.register(TSDiscoverHeaderView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "TSDiscoverHeaderView")
  46. return collectionView
  47. }()
  48. override func createView() {
  49. addNormalNavBarView()
  50. navBarContentView.addSubview(navBarView)
  51. navBarView.snp.makeConstraints { make in
  52. make.edges.equalToSuperview()
  53. }
  54. contentView.addSubview(collectionView)
  55. collectionView.snp.makeConstraints { make in
  56. make.edges.equalToSuperview()
  57. }
  58. }
  59. override func dealThings() {
  60. NotificationCenter.default.addObserver(self, selector: #selector(updateVipView), name: .kPurchaseDidChanged, object: nil)
  61. updateVipView()
  62. }
  63. @objc func updateVipView() {
  64. kMainAsync{
  65. self.vipBtn.isHidden = PurchaseManager.default.isVip
  66. }
  67. }
  68. }
  69. extension TSDiscoverVC: UICollectionViewDataSource ,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout{
  70. func numberOfSections(in collectionView: UICollectionView) -> Int {
  71. return viewModel.discoverDatas.count
  72. }
  73. func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
  74. if let secModel = viewModel.discoverDatas.safeObj(At:section){
  75. return secModel.items.count
  76. }
  77. return 0
  78. }
  79. func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
  80. if let secModel = viewModel.discoverDatas.safeObj(At:indexPath.section),let cell = collectionView.dequeueReusableCell(withReuseIdentifier: String(describing:secModel.style.cell), for: indexPath) as? TSDiscoverBaseCell, let item = secModel.items.safeObj(At:indexPath.row){
  81. cell.items = item
  82. cell.clickBlock = { [weak self] model in
  83. guard let self = self else { return }
  84. if let secModel = viewModel.discoverDatas.safeObj(At:indexPath.section) {
  85. TSDiscoverVC.clickCell(target: self,indexPath: indexPath, itemModel:model,secModel: secModel)
  86. }
  87. }
  88. return cell
  89. }
  90. return UICollectionViewCell()
  91. }
  92. func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
  93. if let secModel = viewModel.discoverDatas.safeObj(At:indexPath.section),
  94. kind == UICollectionView.elementKindSectionHeader,
  95. let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "TSDiscoverHeaderView", for: indexPath) as? TSDiscoverHeaderView{
  96. header.sectionModel = secModel
  97. header.clickBlock = { [weak self] model in
  98. guard let self = self else { return }
  99. clickHeader(indexPath: indexPath,model: model)
  100. }
  101. return header
  102. }
  103. return UICollectionReusableView()
  104. }
  105. func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize{
  106. if let secModel = viewModel.discoverDatas.safeObj(At:indexPath.section) {
  107. return secModel.style.itemSize
  108. }
  109. return .zero
  110. }
  111. func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets{
  112. if let secModel = viewModel.discoverDatas.safeObj(At:section) {
  113. var sectionEdge = UIEdgeInsets(top: 0, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
  114. if secModel.title.isEmpty {
  115. sectionEdge = UIEdgeInsets(top: 20, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
  116. }
  117. if section == viewModel.discoverDatas.count-1 {
  118. sectionEdge = UIEdgeInsets(top: sectionEdge.top, left: sectionEdge.left, bottom: sectionEdge.bottom+20, right: sectionEdge.right)
  119. }
  120. return sectionEdge
  121. }
  122. return .zero
  123. }
  124. func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
  125. if let secModel = viewModel.discoverDatas.safeObj(At:section),secModel.title.count > 0 {
  126. return CGSize(width: k_ScreenWidth, height: kDiscoverSectionH)
  127. }
  128. return .zero
  129. }
  130. }
  131. extension TSDiscoverVC {
  132. func clickHeader(indexPath:IndexPath,model:TSDiscoverSectionModel) {
  133. kPushVC(target: self, modelVC: TSDiscoverStyleMoreVC(sectionModel: model))
  134. }
  135. static func clickCell(target:UIViewController,indexPath:IndexPath,itemModel:TSDiscoverItemModel,secModel:TSDiscoverSectionModel) {
  136. if itemModel.style.isInterceptMultipleGenerations,
  137. TSGenerateBasePhotoOperationQueue.isAvailabilityHandle(view: target.view)
  138. { return }
  139. dePrint("\(itemModel.style)")
  140. switch itemModel.style {
  141. case .ageOld, .ageChild, .oldPhoto, .eyeOpen, .pretty, .photoLive, .photoQuality, .catTohuman,.process:
  142. kPushVC(target: target, modelVC: TSAIUploadPhotoBaseVC(titleString: itemModel.name, generatorStyle: itemModel.style,disCoverItemModel: itemModel))
  143. case .photoExpand:
  144. kPushVC(target: target, modelVC: TSAIExpandImageVC(upLoadImage: nil))
  145. case .futureBaby:
  146. kPushVC(target: target, modelVC: TSFutureBabyVC())
  147. case .changeEmote:
  148. TSDiscoverVC.enterSelectPhotos(target: target,style: itemModel.style) { image in
  149. kPushVC(target: target, modelVC: TSAIChangeEmoteVC(upLoadImage: image, style: .changeEmote))
  150. }
  151. break
  152. case .changehairColor:
  153. TSDiscoverVC.enterSelectPhotos(target: target,style: itemModel.style) { image in
  154. kPushVC(target: target, modelVC: TSAIChangeEmoteVC(upLoadImage: image, style: .changehairColor))
  155. }
  156. break
  157. case .changehair:
  158. TSDiscoverVC.enterSelectPhotos(target: target,style: itemModel.style) { image in
  159. kPushVC(target: target, modelVC: TSAIChangeEmoteVC(upLoadImage: image, style: .changehair))
  160. }
  161. case .ttp:
  162. kPushVC(target: target, modelVC: TSTTPInputVC())
  163. case .chat:
  164. let vc = TSChatViewController()
  165. vc.viewModel.uiStyle = .chat
  166. kPushVC(target: target, modelVC: vc)
  167. case .ptp:
  168. if let generateModel = itemModel.generateModel{
  169. kPushVC(target: target, modelVC: TSPTPUploadImageVC(generateModel: generateModel, sectionModel: secModel))
  170. }
  171. default:
  172. break
  173. }
  174. }
  175. }
  176. extension TSDiscoverVC{
  177. static func enterSelectPhotos(target:UIViewController,style:TSFuncStyle,complete: @escaping (UIImage)->Void){
  178. if style.userDefaultsKey.count == 0 {
  179. self.pickSinglePhoto(target:target,complete:complete)
  180. }else{
  181. TSAIListHintBaseVC.userDefaultsKey = style.userDefaultsKey
  182. if TSAIListHintBaseVC.isShowUploadImageHint{
  183. TSAIListHintBaseVC.isShowUploadImageHint = false
  184. self.presentModalHintVC(target:target,config:style.config,complete:complete)
  185. }else {
  186. self.pickSinglePhoto(target:target,complete:complete)
  187. }
  188. }
  189. }
  190. static func presentModalHintVC(target:UIViewController,config:TSAIListHintBaseVC.Config,complete:@escaping (UIImage)->Void){
  191. let hintBaseVC = TSAIListHintBaseVC(config: config)
  192. hintBaseVC.clickUpImageHandle = { image in
  193. if let image = image {
  194. complete(image)
  195. }else{
  196. dePrint("图片异常")
  197. }
  198. kDelayMainShort {
  199. hintBaseVC.dismissPageVC()
  200. }
  201. }
  202. kPresentModalVC(target: target, modelVC: hintBaseVC,transitionStyle: .crossDissolve)
  203. }
  204. static func pickSinglePhoto(target:UIViewController,complete: @escaping (UIImage)->Void) {
  205. let photoPickerManager = TSPhotoPickerManager(viewController: target)
  206. photoPickerManager.pickCustomSinglePhoto() { image, errorString in
  207. if let errorString = errorString {
  208. TSToastShared.showToast(text: errorString)
  209. }else if let image = image {
  210. complete(image)
  211. }else{
  212. dePrint("图片异常")
  213. }
  214. kDelayMainShort {
  215. photoPickerManager.dismissPageVC()
  216. }
  217. }
  218. }
  219. }