123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- //
- // TSAIChangeEmoteVC.swift
- // AIEmoji
- //
- // Created by 100Years on 2025/4/10.
- //
- import PhotosUI
- class TSAIChangeEmoteVC: TSBaseVC {
-
-
- enum Style {
- case changeEmote
- case changehairColor
- case changehair
- }
-
- lazy var viewModel: TSAIChangeEmoteVM = {
- let viewModel:TSAIChangeEmoteVM = TSAIChangeEmoteVM(style: style)
- return viewModel
- }()
-
- var upLoadImage:UIImage?{
- didSet{
- topImageView.image = upLoadImage
- }
- }
- var style:Style
- init(upLoadImage: UIImage,style:Style) {
- self.upLoadImage = upLoadImage
- self.style = style
- super.init()
- }
-
- @MainActor required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- lazy var photoPickerManager: TSPhotoPickerManager = {
- let photoPickerManager = TSPhotoPickerManager(viewController: self)
- return photoPickerManager
- }()
-
- //###################################### topImageView ######################################
- lazy var topImageView: UIImageView = {
- let imageView = UIImageView()
- imageView.isUserInteractionEnabled = true
- imageView.contentMode = .scaleAspectFit
- return imageView
- }()
-
- //###################################### style类型 ######################################
- var selectedmodel:TSGenerateStyleModel?
- lazy var styleView: TSAIChangeEmoteStyleView = {
- let styleView = TSAIChangeEmoteStyleView()
- styleView.dataArray = viewModel.selectStyleModels
- styleView.currentIndexPath = IndexPath(item: viewModel.selectedStyleIndex, section: 0)
- styleView.selectedValueBlock = { [weak self] model in
- guard let self = self else { return }
- selectedmodel = model
- handelSelectedValueBlock(model: model)
- }
- return styleView
- }()
- //###################################### 按钮 ######################################
-
- lazy var saveBtn: UIButton = {
- let btn = UIButton.createButton(title: "Save".localized,backgroundColor: .themeColor,font: .font(size: 12,weight: .medium),titleColor: "#111111".uiColor,corner: 14){ [weak self] in
- guard let self = self else { return }
- saveCurrentImage()
- }
- btn.contentEdgeInsets = UIEdgeInsets(top: 0, left: 25, bottom: 0, right: 25)
- return btn
- }()
-
- lazy var switchOriginalPictureBtn: TSUIExpandedTouchButton = {
- let switchOriginalPictureBtn = TSUIExpandedTouchButton()
- switchOriginalPictureBtn.setUpButton(image:UIImage(named: "switch_original_picture"))
- switchOriginalPictureBtn.addTarget(self, action: #selector(switchOriginalPictureTouchDown), for: .touchDown)
- switchOriginalPictureBtn.addTarget(self, action: #selector(switchOriginalPictureTouchUp), for: [.touchUpInside, .touchUpOutside, .touchCancel])
- switchOriginalPictureBtn.isHidden = true
- return switchOriginalPictureBtn
- }()
-
- lazy var generateInView : TSGeneratorView = {
- let generateInView = TSGeneratorView()
- generateInView.setBackgroundColor(color: UIColor.black.withAlphaComponent(0.8))
- generateInView.isHidden = true
- generateInView.animationView.setText(time: String(format: "~ %d seconds".localized, 20), info: "")
- generateInView.clickErrorBlock = { [weak self] style in
- guard let self = self else { return }
-
- switch style {
- case .netWorkError:
- if let selectedmodel = selectedmodel {
- handelSelectedValueBlock(model: selectedmodel)
- }
- case .generalError:
- generateInView.isHidden = true
- default:
- break
- }
- }
-
- return generateInView
- }()
-
- override func createView() {
- setUpView()
-
- view.addSubview(generateInView)
- generateInView.snp.makeConstraints { make in
- make.edges.equalToSuperview()
- }
-
- let image = upLoadImage
- upLoadImage = image
- viewModel.upLoadImage = image
- }
-
- override func dealThings() {
- viewModel.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self] (state,model) in
- guard let self = self else { return }
- self.upDateView(state: state, model: model)
- }.store(in: &cancellable)
- }
-
- override func navBarClickLeftAction() {
- if viewModel.isNeedSavePhoto{
- TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
- message: "You haven't saved the photo yet. Are you sure to quit?".localized,
- messageColor: .white,
- messageFont: .systemFont(ofSize: 16),
-
- cancelTitle: "Quit".localized,
- cancelColor: .white,
-
- confirmTitle: "Save".localized,
- confirmColor: .themeColor,
-
- cancelAction: { [weak self] in
- guard let self = self else { return }
- print("用户点击了Leave")
- pop()
- },
- confirmAction: { [weak self] in
- guard let self = self else { return }
- print("用户点击了Stay")
- saveCurrentImage()
- }
- ))
- }else{
- pop()
- }
- }
- }
- extension TSAIChangeEmoteVC {
-
- func setUpView() {
-
- addNormalNavBarView()
- setPageTitle("")
- normalNavBarView.barView.addSubview(saveBtn)
- saveBtn.snp.makeConstraints { make in
- make.centerY.equalToSuperview()
- make.trailing.equalTo(-16)
- make.height.equalTo(28)
- }
- contentView.addSubview(styleView)
- contentView.addSubview(topImageView)
- styleView.snp.makeConstraints { make in
- make.bottom.equalTo(-10-k_Height_safeAreaInsetsBottom())
- make.leading.trailing.equalTo(0)
- make.height.equalTo(100)
- }
-
- topImageView.snp.makeConstraints { make in
- make.bottom.equalTo(styleView.snp.top).offset(-10)
- make.leading.equalTo(0)
- make.trailing.equalTo(0)
- make.top.equalTo(0)
- }
-
- topImageView.addSubview(switchOriginalPictureBtn)
- switchOriginalPictureBtn.snp.makeConstraints { make in
- make.bottom.equalTo(-16)
- make.trailing.equalTo(-16)
- make.width.equalTo(40)
- make.height.equalTo(40)
- }
- }
-
- }
- extension TSAIChangeEmoteVC {
- func handelSelectedValueBlock(model:TSGenerateStyleModel) {
- switchOriginalPictureBtn.isHidden = true
- if model.clickType == 1 { //无类型
- topImageView.image = upLoadImage
- styleView.agreeWillSelectIndexPath()
- }else if model.clickType == 2 { //换图
- self.pickSinglePhoto()
- }else{
- if kJudgeVip(externalBool: true, vc: self){ return }//判断 vip
- viewModel.selectStyleModel = model
- viewModel.uploadAndCreatImage()
- }
- }
-
- @objc func uploadAndCreatImage() {
- if kJudgeVip(externalBool: true, vc: self){ return }//判断 vip
- viewModel.uploadAndCreatImage()
- }
-
- @objc func switchOriginalPictureTouchDown() {
- self.topImageView.image = upLoadImage
- }
-
- @objc func switchOriginalPictureTouchUp() {
- guard let selectStyleModel = viewModel.selectStyleModel else { return }
- guard let actionInfoModel = selectStyleModel.actionInfoModel else { return }
- self.topImageView.setAsyncImage(urlString: actionInfoModel.response.resultUrl,placeholder:upLoadImage)
- }
- }
- extension TSAIChangeEmoteVC {
-
- func pickSinglePhoto() {
- // photoPickerManager.pickSinglePhoto(maxBitSize: kUploadImageMaxBit10Size) { [weak self] image, errorString in
- photoPickerManager.pickCustomSinglePhoto() { [weak self] image, errorString in
- guard let self = self else { return }
- if let errorString = errorString {
- TSToastShared.showToast(text: errorString)
- }else{
- handlePhotoPicke(image: image)
- }
- }
- }
-
- func handlePhotoPicke(image:UIImage?){
- if let image = image {
- upLoadImage = image
- viewModel.upLoadImage = image
- styleView.currentIndexPath = IndexPath(item: 1, section: 0)
- }
-
- if upLoadImage == nil {
- pop()
- }
- }
-
- func saveCurrentImage(){
- if let img = topImageView.image, let image = img.pngImage{
- PhotoManagerShared.saveImageToAlbum(image) {[weak self] success, error in
- guard let self = self else { return }
- if success {
- viewModel.isSavePhotoMark = true
- kSaveSuccesswShared.show(atView:self.view)
- }else{
- debugPrint(error)
- }
- }
- }
- }
- }
- extension TSAIChangeEmoteVC {
- func upDateView(state:TSProgressState,model:TSActionInfoModel?){
- switch state {
- case .failed(let errorStr,let code):
- showError(text: errorStr,code:code)
- case .success:
- if let model = model {
- showSuccess(model: model)
- }else{
- showError(text: "")
- }
- case .progressString(let string):
- showProgress(text: string)
- case .none:
- generateInView.isHidden = true
- generateInView.isRotating = false
- default:
- showLoading()
- }
- }
- func showProgress(text:String) {
- generateInView.updateShowProgress(text: text)
-
- generateInView.xBtn.isHidden = true
- }
-
- func showLoading(){
- generateInView.updateShowLoading(text: "Generating".localized + " ...".localized)
-
- generateInView.xBtn.isHidden = true
-
- }
-
- func showError(text:String,code:Int = 0){
- generateInView.updateShowError(text: text,code: code)
-
- generateInView.xBtn.isHidden = false
- }
-
- func showSuccess(model:TSActionInfoModel){
- generateInView.updateShowSuccess()
-
- generateInView.xBtn.isHidden = true
-
- viewModel.selectStyleModel?.actionInfoModel = model
- self.topImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder:upLoadImage)
-
- styleView.agreeWillSelectIndexPath()
- }
- }
|