123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363 |
- //
- // TSPhotoToPhotoVC.swift
- // AIEmoji
- //
- // Created by 100Years on 2025/2/25.
- //
- class TSPhotoToPhotoVC: TSBaseVC {
- lazy var viewModel:TSPhotoToPhotoVM = {
- let vm = TSPhotoToPhotoVM()
- vm.isCanGennerateBlock = { [weak self] isCan in
- guard let self = self else { return }
- submitBtn.isEnabled = isCan
- }
- return vm
- }()
-
- //###################################### 导航栏 view ######################################
- lazy var vipBtn: UIButton = {
- let vipBtn = UIButton.createButton(image: UIImage(named: "nav_vip")) { [weak self] in
- guard let self = self else { return }
- TSPurchaseVC.show(target: self) {
-
- }
- }
- return vipBtn
- }()
-
- lazy var navBarView: TSBaseNavContentBarView = {
- let navBarView = TSBaseNavContentBarView()
-
- let titleImageView = UIImageView.createImageView(imageName: "nav_title_pic",contentMode: .scaleToFill)
- navBarView.barView.addSubview(titleImageView)
- titleImageView.snp.makeConstraints { make in
- make.centerY.equalToSuperview()
- make.left.equalTo(16)
- }
-
- let keyboardBtn = UIButton.createButton(image: UIImage(named: "keyboard")) { [weak self] in
- guard let self = self else { return }
- kPresentModalVC(target: self, modelVC: TSWallpaperVC())
- }
- navBarView.barView.addSubview(keyboardBtn)
- keyboardBtn.snp.makeConstraints { make in
- make.centerY.equalToSuperview()
- make.trailing.equalTo(-16)
- make.width.height.equalTo(24)
- }
-
- navBarView.barView.addSubview(vipBtn)
- vipBtn.snp.makeConstraints { make in
- make.centerY.equalToSuperview()
- make.trailing.equalTo(-60)
- make.width.height.equalTo(24)
- }
-
- return navBarView
- }()
-
-
- //###################################### 入口 view ######################################
-
- // lazy var bannerBtn: UIButton = {
- // let bannerBtn = UIButton.createButton(backgroundImage: UIImage(named: "ptp_banner"))
- // bannerBtn.addTarget(self, action: #selector(clickPTPEnterView), for: .touchUpInside)
- // bannerBtn.frame = CGRect(x: 16, y: 17, width: k_ScreenWidth-32, height: 117)
- // return bannerBtn
- // }()
- let bannerY:CGFloat = 17
- let bannerW:CGFloat = 166*kDesignScale
- let bannerH:CGFloat = 117*kDesignScale
- lazy var textToPhotoBannerBtn: UIButton = {
- let textToPhotoBannerBtn = UIButton.createButton(backgroundImage: UIImage(named: "textToPhoto_banner"))
- textToPhotoBannerBtn.addTarget(self, action: #selector(clickTextToPhoto), for: .touchUpInside)
- textToPhotoBannerBtn.frame = CGRect(x: 16, y: bannerY, width: bannerW, height: bannerH)
-
- let label = UILabel.createLabel(text: "Text ➡️ Photo".localized,font: .font(name:.PoppinsBlackItalic,size: 16),textColor: .white)
- textToPhotoBannerBtn.addSubview(label)
- label.snp.makeConstraints { make in
- make.top.equalTo(12)
- make.leading.equalTo(8)
- make.height.equalTo(24)
- }
-
- let button = UIButton.createButton(title:"Try Now".localized,backgroundColor:.white,font: .font(size: 11),titleColor: "#ED69AA".uiColor,corner: 9)
- button.contentEdgeInsets = UIEdgeInsets(top: 0, left: 6, bottom: 0, right: 6)
- textToPhotoBannerBtn.addSubview(button)
- button.snp.makeConstraints { make in
- make.top.equalTo(44)
- make.leading.equalTo(8)
- make.height.equalTo(18)
- }
-
- return textToPhotoBannerBtn
- }()
- lazy var textToEmojiBannerBtn: UIButton = {
- let textToEmojiBannerBtn = UIButton.createButton(backgroundImage: UIImage(named: "textToEmoji_banner"))
- textToEmojiBannerBtn.addTarget(self, action: #selector(clickTextToEmoji), for: .touchUpInside)
- let x = textToPhotoBannerBtn.x + textToPhotoBannerBtn.width + 11.0
- textToEmojiBannerBtn.frame = CGRect(x: x, y: bannerY, width: bannerW, height: bannerH)
-
- let color:UIColor = "#7855D6".uiColor
- let label = UILabel.createLabel(text: "Text ➡️ Emoji".localized,font: .font(name:.PoppinsBlackItalic,size: 16),textColor: color)
- textToEmojiBannerBtn.addSubview(label)
- label.snp.makeConstraints { make in
- make.top.equalTo(12)
- make.leading.equalTo(8)
- make.height.equalTo(24)
- }
-
- let button = UIButton.createButton(title:"Try Now".localized,backgroundColor:color,font: .font(size: 11),titleColor: "#D0D5FF".uiColor,corner: 9)
- button.contentEdgeInsets = UIEdgeInsets(top: 0, left: 6, bottom: 0, right: 6)
- textToEmojiBannerBtn.addSubview(button)
- button.snp.makeConstraints { make in
- make.top.equalTo(44)
- make.leading.equalTo(8)
- make.height.equalTo(18)
- }
-
- return textToEmojiBannerBtn
- }()
- let collectionViewBtootm:CGFloat = 80
- lazy var collectionComponent: TSCollectionViewComponent = {
- let layout = UICollectionViewFlowLayout()
- let cp = TSCollectionViewComponent(frame: CGRect.zero, layout: layout, attributes: [:])
- cp.collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: collectionViewBtootm, right: 0)
-
- //点击 cell中的某个按钮
- cp.itemActionHandler = { [weak self] cellCp, indexPath in
- guard let self = self else { return }
- if indexPath == IndexPath(item: 0, section: 0) {
- if let text = cellCp as? String{
- if text == "add" {//选择图片
- photoPickerManager.pickSinglePhoto { [weak self] image,phAsset in
- guard let self = self else { return }
- let maxSize = 10 * 1024 * 1024
-
- if let image = image,let phAsset = phAsset {
- // 方法2:异步获取详细大小(不阻塞主线程)
- TSPhotoSizeHelper.getImageFileSizeAsync(asset: phAsset) {[weak self] size in
- guard let self = self else { return }
-
- let mbSize = Double(size) / (1024 * 1024)
- print("精确大小: \(mbSize) MB,size = \(size)")
- if size > maxSize {
- TSToastShared.showToast(text: "Photo must be smaller than 10MB.".localized)
- }else{
- upDateUpLoadImage(image: image)
- }
- }
- }else if let image = image {
- if image.isLargerThan(byteSize: maxSize) {
- TSToastShared.showToast(text: "Photo must be smaller than 10MB.".localized)
- }else{
- upDateUpLoadImage(image: image)
- }
- }
- }
- }else if text == "delete"{//删除图片
- viewModel.upLoadImage = nil
- UIView.performWithoutAnimation {
- cp.collectionView.reloadSections(IndexSet(integer: 0))
- }
- }
- }
- }else if let model = cellCp as? TSGenerateStyleModel ,indexPath == IndexPath(item: 0, section: 1) {
- //选择了某个样式
- viewModel.selectedPTPStyleModel = model
- updateVipView()
- dePrint("selectedPTPStyleModel=\(model.toJSON())")
- }
- }
-
- cp.sectionActionHandler = { [weak self] cellCp, indexPath in
- guard let self = self else { return }
- if let cmd = cellCp as? String, cmd == "delete" {
- showCustomAlert(message: "Are you sure to delete".localized, deleteHandler: {
- self.viewModel.removeAllHistoryList()
- self.collectionComponent.clear()
- self.collectionComponent.reloadView(with: self.viewModel.colDataArray)
- })
- }
- }
-
- cp.itemDidSelectedHandler = { [weak self] (object, indexPath) in
- guard let self = self else { return }
- if indexPath.section == 0{
- return
- }
-
- if let sections = viewModel.colDataArray.safeObj(At: indexPath.section) as? TSGenmojiCoLSectionModel{
- var dataModelArray:[TSActionInfoModel] = []
- for itemModel in sections.items {
- dataModelArray.append(itemModel.dataModel)
- }
-
- let browseVC = TSAIPhotoBrowseVC()
- browseVC.dataModelArray = dataModelArray
- browseVC.currentIndex = indexPath.item
- kPresentModalVC(target: self, modelVC: browseVC,transitionStyle: .crossDissolve)
- }
- }
- return cp
- }()
-
-
- func upDateUpLoadImage(image:UIImage){
- viewModel.upLoadImage = image
- UIView.performWithoutAnimation {
- collectionComponent.collectionView.reloadSections(IndexSet(integer: 0))
- }
- }
-
- lazy var submitBtn: UIButton = {
- let submitBtn = kCreateNormalSubmitBtn(title: getVipText()) { [weak self] in
- guard let self = self else { return }
- uploadImage()
- }
- submitBtn.cornerRadius = 24.0
- submitBtn.isEnabled = false
- return submitBtn
- }()
- lazy var photoPickerManager: TSPhotoPickerManager = {
- let photoPickerManager = TSPhotoPickerManager(viewController: self)
- return photoPickerManager
- }()
-
- override func createView() {
-
- navBarContentView.addSubview(navBarView)
- navBarView.snp.makeConstraints { make in
- make.edges.equalToSuperview()
- }
-
- contentView.addSubview(collectionComponent.collectionView)
- collectionComponent.collectionView.snp.makeConstraints { make in
- make.edges.equalToSuperview()
- }
-
- collectionComponent.clear()
- collectionComponent.reloadView(with:viewModel.colDataArray)
-
- contentView.addSubview(submitBtn)
- submitBtn.snp.makeConstraints { make in
- make.bottom.equalTo(-k_Height_safeAreaInsetsBottom())
- make.leading.equalTo(16)
- make.trailing.equalTo(-16)
- make.height.equalTo(48)
- }
-
- // //顶部入口跳转按钮
- // let vcViewH = bannerBtn.frame.origin.y+bannerBtn.frame.size.height
- // collectionComponent.collectionView.addSubview(bannerBtn)
- // collectionComponent.collectionView.contentInset = UIEdgeInsets(top: vcViewH, left: 0, bottom: collectionViewBtootm, right: 0)
- // bannerBtn.y = -bannerBtn.frame.size.height
-
-
- //顶部入口跳转按钮
- let bannerBtn = textToPhotoBannerBtn
- let vcViewH = bannerBtn.frame.origin.y+bannerBtn.frame.size.height
- collectionComponent.collectionView.addSubview(bannerBtn)
- collectionComponent.collectionView.contentInset = UIEdgeInsets(top: vcViewH, left: 0, bottom: collectionViewBtootm, right: 0)
- bannerBtn.y = -bannerBtn.frame.size.height
- collectionComponent.collectionView.addSubview(textToEmojiBannerBtn)
- textToEmojiBannerBtn.y = bannerBtn.y
- }
-
- override func dealThings() {
- NotificationCenter.default.addObserver(self, selector: #selector(vipInfoChanged), name: .kPurchaseDidChanged, object: nil)
- updateVipView()
- }
-
- @objc func vipInfoChanged() {
- kExecuteOnMainThread {
- self.updateVipView()
- }
- }
- func updateVipView() {
- kExecuteOnMainThread {
- self.vipBtn.isHidden = PurchaseManager.default.isVip
-
- var showVip = kPurchaseDefault.generateVipShow(type: .picToPic)
- if showVip == false {
- showVip = self.viewModel.selectedPTPStyleModel?.isVip ?? false
- }
-
- kSetBtnVipIcon(btn: self.submitBtn, show: showVip)
- }
- }
- @objc func clickCollectionView() {
- view.endEditing(true)
- }
- }
- extension TSPhotoToPhotoVC {
-
- @objc func clickPTPEnterView() {
- kPushVC(target: self, modelVC: TSTextGeneralPictureVC())
- }
-
- @objc func clickTextToPhoto() {
- kPushVC(target: self, modelVC: TSTextGeneralPictureVC())
- }
-
- @objc func clickTextToEmoji() {
- kPushVC(target: self, modelVC: TSGenmojiVC())
- }
-
- func uploadImage(){
- generateImage()
- }
-
- func generateImage() {
-
- var isVip = kPurchaseDefault.freeNumAvailable(type: .picToPic) == false
- if viewModel.selectedPTPStyleModel?.isVip == true {
- isVip = true
- }
-
- //判断 vip
- if kJudgeVip(externalBool: isVip, vc: self) { [weak self] in
- guard let self = self else { return }
- }{ return }
-
- guard let selectedPTPStyleModel = viewModel.selectedPTPStyleModel else { return }
- guard let upLoadImage = viewModel.upLoadImage else { return }
- let gennerateVC = TSPTPGeneratorVC(prompt: selectedPTPStyleModel.prompt,promptSort: selectedPTPStyleModel.imageText , imageUrl: "",upLoadImage: upLoadImage,style: selectedPTPStyleModel.style) { [weak self] model in
- guard let self = self else { return }
- if viewModel.saveModel(model:model) {
- collectionComponent.clear()
- collectionComponent.reloadView(with:viewModel.colDataArray)
- }else{
- collectionComponent.reloadData()
- }
-
- updateVipView()
- }
-
- kPresentModalVC(target: self, modelVC: gennerateVC,transitionStyle: .crossDissolve)
- }
-
-
- func getVipText()->String{
- return "Generate".localized
- // if kPurchaseDefault.isVip {
- // return "Generate"
- // }
- // return "Generate (\(kPurchaseDefault.freeNum(type: .picToPic)))"
- }
- }
|