123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- //
- // TSAIDiyVideoPTVVC.swift
- // AIEmoji
- //
- // Created by 100Years on 2025/7/28.
- //
- class TSAIDiyVideoPTVVC: TSAIDiyVideoTTBaseVC, UIPopoverPresentationControllerDelegate {
- lazy var aiModelView = TSAIModelElementView(frame: .zero)
- lazy var promptTextView: TSDiyVideoPromptElementView = {
- let promptTextView = TSDiyVideoPromptElementView(randomTextArray: kRandomImageToVideoArray) { [weak self] _ in
- guard let self = self else { return }
- }
- promptTextView.uploadClickAction = { [weak self] in
- guard let self = self else { return }
- TSDiscoverVC.enterSelectPhotos(target: self, style: .pictureToVideo, hintType: 0) { [weak self] image in
- guard let self = self else { return }
- self.viewModel.uploadImage = image
- }
- }
- promptTextView.deleteClickAction = { [weak self] in
- guard let self = self else { return }
- self.viewModel.uploadImage = nil
- }
- promptTextView.textChangedBlock = { [weak self] text in
- guard let self = self else { return }
- self.viewModel.prompt = text
- }
- promptTextView.sendBolck = { [weak self] text in
- guard let self = self else { return }
- self.viewModel.prompt = text
- }
- promptTextView.AIBolck = { [weak self] in
- guard let self = self else { return }
- let vc = TSChatViewController()
- vc.viewModel.uiStyle = .perfectHint
- vc.textBlock = { [weak self] text, _ in
- guard let self = self else { return }
- promptTextView.setText(text: text)
- }
- kPushVC(target: self, modelVC: vc)
- }
- return promptTextView
- }()
- lazy var resolution = TSResolutionElementView(aiType: viewModel.selectedAiModelType)
- lazy var length = TSVideoLengthElementView(aiType: viewModel.selectedAiModelType)
- lazy var movement = TSMovementElementView(aiType: viewModel.selectedAiModelType)
- var viewModel: TSAIDiyVideoPTVViewModel = .init()
- override var videoGenerateModel: TSAIDiyVideoGenerateModel {
- let model = TSAIDiyVideoGenerateModel()
- model.model = aiModelView.param
- model.duration = Int(length.param) ?? 0
- model.movement = movement.param
- model.resolution = resolution.param
- model.prompt = viewModel.prompt
- return model
- }
- override var elements: [any TSDiyVideoElement] {
- [
- aiModelView,
- promptTextView,
- resolution,
- length,
- movement,
- ]
- }
- override func createView() {
- super.createView()
- addObservers()
- addActions()
- }
- func addObservers() {
- viewModel.$selectedAiModelType.receive(on: DispatchQueue.main).sink { [weak self] type in
- self?.aiModelView.updateType(type: type)
- self?.length.updateAiModelType(aitype: type)
- self?.resolution.updateAiModelType(aitype: type)
- }.store(in: &cancellable)
- viewModel.$uploadImage.receive(on: DispatchQueue.main).dropFirst().sink { [weak self] image in
- self?.promptTextView.uploadView.upLoadImage = image
- self?.viewModel.judgeWasFinishedEdit()
- }.store(in: &cancellable)
- }
- func addActions() {
- aiModelView.addTapAction { [weak self] in
- guard let self = self else { return }
- // 初始化内容控制器
- let contentVC = TSDiyVideoPopoverViewController()
- contentVC.currentType = self.viewModel.selectedAiModelType
- contentVC.onSelected = { [weak self] type in
- guard let self = self else { return }
- viewModel.selectedAiModelType = type
- }
- // 设置模态呈现样式为Popover
- contentVC.modalPresentationStyle = .popover
- // 配置Popover属性
- if let popoverPresentationController = contentVC.popoverPresentationController {
- popoverPresentationController.delegate = self
- popoverPresentationController.sourceView = self.aiModelView
- popoverPresentationController.sourceRect = .init(origin: .init(x: self.aiModelView.bounds.origin.x, y: self.aiModelView.bounds.origin.y + 100), size: self.aiModelView.bounds.size)
- popoverPresentationController.permittedArrowDirections = []
- popoverPresentationController.backgroundColor = .fromHex("#222222")
- }
- // 呈现Popover
- self.present(contentVC, animated: true, completion: nil)
- }
- }
- // 关键: 确保在iPhone上以Popover形式显示而非全屏
- func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
- return .none
- }
- }
|