123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- //
- // TSAIUploadPhotoVC.swift
- // AIEmoji
- //
- // Created by 100Years on 2025/4/9.
- //
- import PhotosUI
- import BetterSegmentedControl
- class TSAIUploadPhotoVC: TSBaseVC {
- var generatorStyle:TSGeneratorImageStyle
- var titleString:String
- var disCoverItemModel:TSDiscoverItemModel?
- var generateModel:TSGenerateModel?
- var disCoverItemModels:[TSDiscoverItemModel]?
- var isUsedPhoto:Bool = false
- init(titleString:String,
- upLoadImage:UIImage,
- generatorStyle:TSGeneratorImageStyle,
- disCoverItemModel:TSDiscoverItemModel? = nil,
- disCoverItemModels:[TSDiscoverItemModel]? = nil,
- isUsedPhoto:Bool = false
- ) {
- self.titleString = titleString
- self.upLoadImage = upLoadImage
- self.generatorStyle = generatorStyle
- self.disCoverItemModel = disCoverItemModel
- self.generateModel = disCoverItemModel?.generateModel
- self.isUsedPhoto = isUsedPhoto
- self.disCoverItemModels = disCoverItemModels
- super.init()
- }
-
- @MainActor required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
-
-
-
- var deleteComplete:(()->Void)?
-
-
- //###### UI ######
- lazy var cusStackView: TSCustomStackView = TSCustomStackView(axis: .vertical,spacing: 0)
- //上传区域
- lazy var upLoadView: UIView = creatUpLoadView()
- lazy var uploadImageView: UIImageView = creatUploadImageView()
- lazy var uploadImageBgView: UIView = creatUploadImageBgView()
- //提交 btn
- lazy var submitBtn: UIButton = creatSubmitBtn()
- //删除按钮
- lazy var deleteBtn: UIButton = creatDeleteBtn()
-
-
- //###### 视频区域 ######
- lazy var textView: TSAIUploadPhotoTextView = creatTextView()
-
- //更多样式区域
- lazy var styleBarView: TSAIUploadPhotoMoreStyleBarView = creatMoreStyleBarView()
- lazy var videoStyleBarView: TSAIUploadPhotoVideoStyleView = creatVideoStyleBarView()
-
- //###### 数据区 ######
- var uploadImageViewMaxHeight:CGFloat = k_ScreenHeight-76-k_Height_safeAreaInsetsBottom()-k_Nav_Height
- let lineSpacing = 6.0
- lazy var photoPickerManager: TSPhotoPickerManager = TSPhotoPickerManager(viewController: self)
- var hintBaseVC:TSAIListHintBaseVC = TSAIListHintBaseVC(config: .colorizeConfig)
- var upLoadImage:UIImage? = nil {
- didSet{
- if let image = upLoadImage {
- upLoadView.isHidden = true
- uploadImageView.isHidden = false
- deleteBtn.isHidden = false
- uploadImageView.image = image
- submitBtn.isEnabled = true
- }else {
- upLoadView.isHidden = false
- uploadImageView.isHidden = true
- deleteBtn.isHidden = true
- uploadImageView.image = nil
- submitBtn.isEnabled = false
- }
- updateUploadImageViewFrame()
- }
- }
- var additionalPrompt = ""
-
- override func createView() {
-
- addNormalNavBarView()
- setPageTitle(titleString)
-
- if isUsedPhoto {
- _ = setNavigationItem("", imageName: "ai_delete", direction: .right, action: #selector(clickNavDelete))
- }else{
- _ = setNavigationItem("", imageName: "replace_photo", direction: .right, action: #selector(clickNavRight))
- }
- let tap = UITapGestureRecognizer(target: self, action: #selector(clickView))
- tap.cancelsTouchesInView = false
- view.addGestureRecognizer(tap)
-
- contentView.addSubview(submitBtn)
- submitBtn.snp.makeConstraints { make in
- make.centerX.equalToSuperview()
- make.width.equalTo(250*kDesignScale)
- make.height.equalTo(48)
- make.bottom.equalTo(-12-k_Height_safeAreaInsetsBottom())
- }
-
- contentView.addSubview(cusStackView)
- cusStackView.snp.makeConstraints { make in
- make.top.equalTo(0)
- make.leading.trailing.equalToSuperview()
- // make.bottom.equalTo(submitBtn.snp.top).offset(-16)
- make.bottom.equalTo(submitBtn.snp.top)
- }
-
- setUpStackView()
-
- let image = upLoadImage
- upLoadImage = image
- }
- override func dealThings() {
- NotificationCenter.default.addObserver(self, selector: #selector(updateVipView), name: .kPurchaseDidChanged, object: nil)
- updateVipView()
-
- }
-
- @objc func updateVipView() {
- kMainAsync {
- kSetBtnVipIcon(btn: self.submitBtn, show: kPurchaseBusiness.generateVipShow(type: self.generatorStyle == .creatVideo ? .generalVideo :.general))
- }
- }
- func setUpStackView(){
- if let disCoverItemModels = self.disCoverItemModels,generatorStyle == .creatVideo{
- setUpVideoStyleBarView(discoverItemModels:disCoverItemModels)
- }else if let styleArray = getStyleArray(){
- setUpMoreStyleBarView(styleModels: styleArray)
- }else if generatorStyle == .creatVideo {
- setUpVideoUploadView()
- }else{
- setUpImageUploadView()
- }
- }
-
- func updateUploadImageViewFrame() {
-
- if let image = upLoadImage {
- let newSize = kGetSubFrame(superSize: CGSizeMake(k_ScreenWidth, uploadImageViewMaxHeight), subViewSize: image.size)
- uploadImageView.snp.remakeConstraints{ make in
- make.center.equalToSuperview()
- make.width.equalTo(newSize.width)
- make.height.equalTo(newSize.height)
- }
- }else{
- uploadImageView.snp.remakeConstraints { make in
- make.height.equalTo(k_ScreenWidth)
- make.center.equalToSuperview()
- make.width.equalTo(k_ScreenWidth)
- }
- }
- }
-
-
- func generateImage() {
- if kShowGenerateBusyView(view: WindowHelper.getCurrentWindow() ?? self.view,clickViewBlock: { [weak self] in
- guard let self = self else { return }
- self.navigationController?.popToRootViewController(animated: true)
- }) {
- return
- }
- if kPurchaseBusiness.kJudgeVipFreeType(vipFreeNumType: generatorStyle == .creatVideo ? .generalVideo : .general){ return }//判断 vip
-
- guard let upLoadImage = upLoadImage else { return }
- let generatorModel = TSAIListPhotoGeneratorModel(upLoadImage: upLoadImage, generatorStyle: generatorStyle,additionalPrompt: additionalPrompt)
- if let generateModel = generateModel{
- generatorModel.prompt = generateModel.prompt + additionalPrompt
- generatorModel.model = generateModel.model
- }else{
- if let promptModel = generatorStyle.generateModel{
- generatorModel.prompt = promptModel.prompt + additionalPrompt
- generatorModel.model = promptModel.model
- }
- }
-
- let gennerateVC = TSAIListPhotoGeneratorVC(generatorModel:generatorModel){[weak self] model in
- guard let self = self else { return }
- updateVipView()
- }
-
- gennerateVC.backstageBlock = { [weak self] in
- guard let self = self else { return }
- self.navigationController?.popToRootViewController(animated: false)
- }
- kPresentModalVC(target: self, modelVC: gennerateVC,transitionStyle: .crossDissolve)
- }
- }
- extension TSAIUploadPhotoVC {
- func setDeleteComplete(deleteComplete:@escaping ()->Void){
- self.deleteComplete = deleteComplete
- }
-
- @objc func clickNavDelete() {
- TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
- message: "Are you sure to delete?".localized,
- cancelTitle: "Delete".localized,
- cancelColor: .red,
- confirmTitle: "Retain".localized,
- confirmColor: .white,
- cancelAction: { [weak self] in
- guard let self = self else { return }
- self.deleteComplete?()
- self.pop()
- }
- ))
- }
- }
- extension TSAIUploadPhotoVC {
- @objc func clickView() {
- self.view.endEditing(true)
- }
-
- @objc func clickNavRight() {
- clickView()
- pickSinglePhoto()
- }
-
- @objc func clickBgView() {
- clickView()
- pickSinglePhoto()
- }
-
- func pickSinglePhoto() {
- pickSinglePhoto{ [weak self] image in
- guard let self = self else { return }
- upLoadImage = image
- }
- }
- }
- extension TSAIUploadPhotoVC {
-
- var prompt:String{
- if self.generatorStyle == .creatVideo {
- if additionalPrompt.isEmpty {
- return "Photo animation, Slight head turn, normal eye blinking, smile, realistic facial movement"
- }
- return additionalPrompt
- }
- return ""
- }
- }
|