123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- //
- // TSAIDiyVideoVC.swift
- // TSLiveWallpaper
- //
- // Created by 100Years on 2025/7/28.
- //
- import IQKeyboardCore
- import JXSegmentedView
- let segmentedBgColor: UIColor = "#292929".uiColor
- class TSAIDiyVideoVC: TSBaseVC {
- var diyVideoType: Int = 0 // 0 图生视频,1 文生视频
- // 选择生成的视频参数模型
- var selectedGenerateModel: TSAIDiyVideoGenerateModel? {
- if let vc = viewControllers[segmentedView.selectedIndex] as? TSAIDiyVideoTTBaseVC {
- return vc.videoGenerateModel
- }
- return nil
- }
- lazy var listContainerView: JXSegmentedListContainerView = {
- let listContainerView = JXSegmentedListContainerView(dataSource: self)
- listContainerView.frame = CGRect(x: 0, y: 48, width: UIScreen.main.bounds.size.width, height: k_ScreenHeight - k_Nav_Height - 48)
- return listContainerView
- }()
- lazy var segmentedDataSource: JXSegmentedTitleDataSource = {
- let dataSource = JXSegmentedTitleDataSource()
- dataSource.isTitleColorGradientEnabled = true
- dataSource.isItemSpacingAverageEnabled = false
- dataSource.itemSpacing = 0
- dataSource.itemWidth = itemWidth
- dataSource.itemWidthIncrement = 0
- dataSource.titles = ["Image to Video".localized, "Text to Video".localized]
- dataSource.titleNormalColor = .white.withAlphaComponent(0.8)
- dataSource.titleSelectedColor = "#111111".uiColor
- dataSource.titleNormalFont = .font(size: 12.0)
- dataSource.titleSelectedFont = .font(size: 12.0, weight: .medium)
- return dataSource
- }()
- lazy var itemWidth: CGFloat = (UIScreen.main.bounds.size.width - 32) / 2.0
- lazy var indicator: JXSegmentedIndicatorBackgroundView = {
- let indicator = JXSegmentedIndicatorBackgroundView()
- indicator.indicatorWidth = itemWidth - 4
- indicator.indicatorWidthIncrement = 0
- indicator.indicatorHeight = 36
- indicator.indicatorColor = .themeColor
- indicator.indicatorCornerRadius = 18
- indicator.indicatorPosition = .center
- return indicator
- }()
- lazy var segmentedView: JXSegmentedView = {
- let segmentedView = JXSegmentedView(frame: CGRect(x: 16, y: 8, width: UIScreen.main.bounds.size.width - 32, height: 40.0))
- segmentedView.delegate = self
- segmentedView.indicators = [indicator]
- segmentedView.dataSource = segmentedDataSource
- segmentedView.backgroundColor = segmentedBgColor
- segmentedView.listContainer = listContainerView
- segmentedView.cornerRadius = 20
- segmentedView.defaultSelectedIndex = diyVideoType
- return segmentedView
- }()
- lazy var ptvVc = TSAIDiyVideoPTVVC()
- lazy var ttvVc = TSAIDiyVideoTTVVC()
- lazy var viewControllers: [UIViewController] = {
- [ptvVc, ttvVc]
- }()
- lazy var creatBtnView: TSAppBtnView = {
- let creatBtnView = TSAppBtnView()
- let vipFreeNumType = VipFreeNumType.videoV2
- creatBtnView.setUpButton(style: .generate, vipFreeNumType: vipFreeNumType) { [weak self] in
- guard let self = self else { return }
- generateVideo()
- }
- creatBtnView.setBtnEnabled(isEnabled: false)
- creatBtnView.isIconVipBlock = { [weak self] in
- guard let self = self else { return false }
- var showVip = kPurchaseDefault.generateVipShow(type: vipFreeNumType)
- return showVip
- }
- creatBtnView.isClickVipBlock = { [weak self] in
- guard let self = self else { return false }
- var isVip = kPurchaseDefault.freeNumAvailable(type: vipFreeNumType) == false
- return isVip
- }
- return creatBtnView
- }() // Button
- init(diyVideoType: Int) {
- self.diyVideoType = diyVideoType
- super.init()
- }
- @MainActor required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- override func createData() {
- // 初始化数据
- }
- override func createView() {
- setPageTitle("Create Video")
- contentView.addSubview(segmentedView)
- contentView.addSubview(listContainerView)
- contentView.addSubview(creatBtnView)
- creatBtnView.snp.makeConstraints { make in
- make.bottom.equalTo(-k_Height_safeAreaInsetsBottom())
- make.leading.equalTo(16)
- make.trailing.equalTo(-16)
- make.height.equalTo(48)
- }
- }
- override func dealThings() {
- // 监听和逻辑
- NotificationCenter.default.addObserver(self, selector: #selector(updateVipView), name: .kPurchaseDidChanged, object: nil)
- ptvVc.viewModel.$didFinishEdit.receive(on: DispatchQueue.main).sink { [weak self] finish in
- guard let self = self else {
- return
- }
- if segmentedView.selectedIndex == 0 {
- creatBtnView.setBtnEnabled(isEnabled: finish)
- }
- }.store(in: &cancellable)
- ttvVc.viewModel.$didFinishEdit.receive(on: DispatchQueue.main).sink { [weak self] finish in
- guard let self = self else {
- return
- }
- if segmentedView.selectedIndex == 1 {
- creatBtnView.setBtnEnabled(isEnabled: finish)
- }
- }.store(in: &cancellable)
- updateVipView()
- creatBtnView.setBtnEnabled(isEnabled: false) // 设置按钮是否满足生成条件
- }
- @objc func updateVipView() {
- kExecuteOnMainThread {
- self.creatBtnView.updateVipView()
- }
- }
- }
- extension TSAIDiyVideoVC: JXSegmentedViewDelegate {
- func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {
- if segmentedView.selectedIndex == 0 {
- creatBtnView.setBtnEnabled(isEnabled: ptvVc.viewModel.didFinishEdit)
- } else {
- creatBtnView.setBtnEnabled(isEnabled: ttvVc.viewModel.didFinishEdit)
- }
- navigationController?.interactivePopGestureRecognizer?.isEnabled = (index == 0)
- }
- }
- extension TSAIDiyVideoVC: JXSegmentedListContainerViewDataSource {
- func numberOfLists(in listContainerView: JXSegmentedListContainerView) -> Int {
- return viewControllers.count
- }
- func listContainerView(_ listContainerView: JXSegmentedListContainerView, initListAt index: Int) -> JXSegmentedListContainerViewListDelegate {
- return viewControllers[index] as! JXSegmentedListContainerViewListDelegate
- }
- }
- extension TSAIDiyVideoVC {
- func generateVideo() {
- if segmentedView.selectedIndex == 0 {
- guard let img = ptvVc.viewModel.uploadImage else {
- return
- }
- let generatorModel = TSAIGeneratorModel(upLoadImage: img, generatorStyle: .pictureToVideo)
- generatorModel.diyVideoGenerateModel = selectedGenerateModel
- let gennerateVC = TSAIGenerateVC(generatorModel: generatorModel) { [weak self] _ in
- guard let self = self else { return }
- updateVipView()
- }
- kPresentModalVC(target: self, modelVC: gennerateVC, transitionStyle: .crossDissolve)
- } else {
- let generatorModel = TSAIGeneratorModel(upLoadImage: .init(), generatorStyle: .textToVideo)
- generatorModel.diyVideoGenerateModel = selectedGenerateModel
- let gennerateVC = TSAIGenerateVC(generatorModel: generatorModel) { [weak self] _ in
- guard let self = self else { return }
- updateVipView()
- }
- kPresentModalVC(target: self, modelVC: gennerateVC, transitionStyle: .crossDissolve)
- }
- }
- }
|