TSAIDiyVideoVC.swift 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. //
  2. // TSAIDiyVideoVC.swift
  3. // TSLiveWallpaper
  4. //
  5. // Created by 100Years on 2025/7/28.
  6. //
  7. import IQKeyboardCore
  8. import JXSegmentedView
  9. let segmentedBgColor: UIColor = "#292929".uiColor
  10. class TSAIDiyVideoVC: TSBaseVC {
  11. var diyVideoType: Int = 0 // 0 图生视频,1 文生视频
  12. // 选择生成的视频参数模型
  13. var selectedGenerateModel: TSAIDiyVideoGenerateModel? {
  14. if let vc = viewControllers[segmentedView.selectedIndex] as? TSAIDiyVideoTTBaseVC {
  15. return vc.videoGenerateModel
  16. }
  17. return nil
  18. }
  19. lazy var listContainerView: JXSegmentedListContainerView = {
  20. let listContainerView = JXSegmentedListContainerView(dataSource: self)
  21. listContainerView.frame = CGRect(x: 0, y: 48, width: UIScreen.main.bounds.size.width, height: k_ScreenHeight - k_Nav_Height - 48)
  22. return listContainerView
  23. }()
  24. lazy var segmentedDataSource: JXSegmentedTitleDataSource = {
  25. let dataSource = JXSegmentedTitleDataSource()
  26. dataSource.isTitleColorGradientEnabled = true
  27. dataSource.isItemSpacingAverageEnabled = false
  28. dataSource.itemSpacing = 0
  29. dataSource.itemWidth = itemWidth
  30. dataSource.itemWidthIncrement = 0
  31. dataSource.titles = ["Image to Video".localized, "Text to Video".localized]
  32. dataSource.titleNormalColor = .white.withAlphaComponent(0.8)
  33. dataSource.titleSelectedColor = "#111111".uiColor
  34. dataSource.titleNormalFont = .font(size: 12.0)
  35. dataSource.titleSelectedFont = .font(size: 12.0, weight: .medium)
  36. return dataSource
  37. }()
  38. lazy var itemWidth: CGFloat = (UIScreen.main.bounds.size.width - 32) / 2.0
  39. lazy var indicator: JXSegmentedIndicatorBackgroundView = {
  40. let indicator = JXSegmentedIndicatorBackgroundView()
  41. indicator.indicatorWidth = itemWidth - 4
  42. indicator.indicatorWidthIncrement = 0
  43. indicator.indicatorHeight = 36
  44. indicator.indicatorColor = .themeColor
  45. indicator.indicatorCornerRadius = 18
  46. indicator.indicatorPosition = .center
  47. return indicator
  48. }()
  49. lazy var segmentedView: JXSegmentedView = {
  50. let segmentedView = JXSegmentedView(frame: CGRect(x: 16, y: 8, width: UIScreen.main.bounds.size.width - 32, height: 40.0))
  51. segmentedView.delegate = self
  52. segmentedView.indicators = [indicator]
  53. segmentedView.dataSource = segmentedDataSource
  54. segmentedView.backgroundColor = segmentedBgColor
  55. segmentedView.listContainer = listContainerView
  56. segmentedView.cornerRadius = 20
  57. segmentedView.defaultSelectedIndex = diyVideoType
  58. return segmentedView
  59. }()
  60. lazy var ptvVc = TSAIDiyVideoPTVVC()
  61. lazy var ttvVc = TSAIDiyVideoTTVVC()
  62. lazy var viewControllers: [UIViewController] = {
  63. [ptvVc, ttvVc]
  64. }()
  65. lazy var creatBtnView: TSAppBtnView = {
  66. let creatBtnView = TSAppBtnView()
  67. let vipFreeNumType = VipFreeNumType.videoV2
  68. creatBtnView.setUpButton(style: .generate, vipFreeNumType: vipFreeNumType) { [weak self] in
  69. guard let self = self else { return }
  70. generateVideo()
  71. }
  72. creatBtnView.setBtnEnabled(isEnabled: false)
  73. creatBtnView.isIconVipBlock = { [weak self] in
  74. guard let self = self else { return false }
  75. var showVip = kPurchaseDefault.generateVipShow(type: vipFreeNumType)
  76. return showVip
  77. }
  78. creatBtnView.isClickVipBlock = { [weak self] in
  79. guard let self = self else { return false }
  80. var isVip = kPurchaseDefault.freeNumAvailable(type: vipFreeNumType) == false
  81. return isVip
  82. }
  83. return creatBtnView
  84. }() // Button
  85. init(diyVideoType: Int) {
  86. self.diyVideoType = diyVideoType
  87. super.init()
  88. }
  89. @MainActor required init?(coder: NSCoder) {
  90. fatalError("init(coder:) has not been implemented")
  91. }
  92. override func createData() {
  93. // 初始化数据
  94. }
  95. override func createView() {
  96. setPageTitle("Create Video")
  97. contentView.addSubview(segmentedView)
  98. contentView.addSubview(listContainerView)
  99. contentView.addSubview(creatBtnView)
  100. creatBtnView.snp.makeConstraints { make in
  101. make.bottom.equalTo(-k_Height_safeAreaInsetsBottom())
  102. make.leading.equalTo(16)
  103. make.trailing.equalTo(-16)
  104. make.height.equalTo(48)
  105. }
  106. }
  107. override func dealThings() {
  108. // 监听和逻辑
  109. NotificationCenter.default.addObserver(self, selector: #selector(updateVipView), name: .kPurchaseDidChanged, object: nil)
  110. ptvVc.viewModel.$didFinishEdit.receive(on: DispatchQueue.main).sink { [weak self] finish in
  111. guard let self = self else {
  112. return
  113. }
  114. if segmentedView.selectedIndex == 0 {
  115. creatBtnView.setBtnEnabled(isEnabled: finish)
  116. }
  117. }.store(in: &cancellable)
  118. ttvVc.viewModel.$didFinishEdit.receive(on: DispatchQueue.main).sink { [weak self] finish in
  119. guard let self = self else {
  120. return
  121. }
  122. if segmentedView.selectedIndex == 1 {
  123. creatBtnView.setBtnEnabled(isEnabled: finish)
  124. }
  125. }.store(in: &cancellable)
  126. updateVipView()
  127. creatBtnView.setBtnEnabled(isEnabled: false) // 设置按钮是否满足生成条件
  128. }
  129. @objc func updateVipView() {
  130. kExecuteOnMainThread {
  131. self.creatBtnView.updateVipView()
  132. }
  133. }
  134. }
  135. extension TSAIDiyVideoVC: JXSegmentedViewDelegate {
  136. func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {
  137. if segmentedView.selectedIndex == 0 {
  138. creatBtnView.setBtnEnabled(isEnabled: ptvVc.viewModel.didFinishEdit)
  139. } else {
  140. creatBtnView.setBtnEnabled(isEnabled: ttvVc.viewModel.didFinishEdit)
  141. }
  142. navigationController?.interactivePopGestureRecognizer?.isEnabled = (index == 0)
  143. }
  144. }
  145. extension TSAIDiyVideoVC: JXSegmentedListContainerViewDataSource {
  146. func numberOfLists(in listContainerView: JXSegmentedListContainerView) -> Int {
  147. return viewControllers.count
  148. }
  149. func listContainerView(_ listContainerView: JXSegmentedListContainerView, initListAt index: Int) -> JXSegmentedListContainerViewListDelegate {
  150. return viewControllers[index] as! JXSegmentedListContainerViewListDelegate
  151. }
  152. }
  153. extension TSAIDiyVideoVC {
  154. func generateVideo() {
  155. if segmentedView.selectedIndex == 0 {
  156. guard let img = ptvVc.viewModel.uploadImage else {
  157. return
  158. }
  159. let generatorModel = TSAIGeneratorModel(upLoadImage: img, generatorStyle: .pictureToVideo)
  160. generatorModel.diyVideoGenerateModel = selectedGenerateModel
  161. let gennerateVC = TSAIGenerateVC(generatorModel: generatorModel) { [weak self] _ in
  162. guard let self = self else { return }
  163. updateVipView()
  164. }
  165. kPresentModalVC(target: self, modelVC: gennerateVC, transitionStyle: .crossDissolve)
  166. } else {
  167. let generatorModel = TSAIGeneratorModel(upLoadImage: .init(), generatorStyle: .textToVideo)
  168. generatorModel.diyVideoGenerateModel = selectedGenerateModel
  169. let gennerateVC = TSAIGenerateVC(generatorModel: generatorModel) { [weak self] _ in
  170. guard let self = self else { return }
  171. updateVipView()
  172. }
  173. kPresentModalVC(target: self, modelVC: gennerateVC, transitionStyle: .crossDissolve)
  174. }
  175. }
  176. }