123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363 |
- //
- // TSAIUploadPhotoVC.swift
- // AIEmoji
- //
- // Created by 100Years on 2025/4/9.
- //
- import PhotosUI
- import BetterSegmentedControl
- class TSAIUploadPhotoVC: TSBaseVC {
- var generatorStyle:TSGeneratorImageStyle
- var titleString:String
- init(titleString:String,upLoadImage:UIImage,generatorStyle:TSGeneratorImageStyle) {
- self.titleString = titleString
- self.upLoadImage = upLoadImage
- self.generatorStyle = generatorStyle
- super.init()
- }
-
- @MainActor required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
-
- //#####################################数据区#####################################
- let lineSpacing = 6.0
- lazy var photoPickerManager: TSPhotoPickerManager = {
- let photoPickerManager = TSPhotoPickerManager(viewController: self)
- return photoPickerManager
- }()
-
- var hintBaseVC:TSAIListHintBaseVC = TSAIListHintBaseVC(config: .colorizeConfig)
- //#####################################底部基础#####################################
- lazy var cusStackView: TSCustomStackView = {
- let cusStackView = TSCustomStackView(axis: .vertical,spacing: 0)
- return cusStackView
- }()
-
- lazy var submitBtn: UIButton = {
- let submitBtn = kCreateNormalSubmitBtn(title: generatingText) { [weak self] in
- guard let self = self else { return }
- generateImage()
- }
- kSetBtnVipIcon(btn: submitBtn, show: true)
- return submitBtn
- }()
- //#####################################上传 view#####################################
- 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
- }
- }
- }
-
-
- lazy var subInfoLabel: UILabel = {
- let textLabel = UILabel.createLabel(text: "Select an image with face fully visible".localized,font: .font(size: 12),textColor: UIColor.white.withAlphaComponent(0.6),textAlignment: .center,numberOfLines: 0)
- return textLabel
- }()
-
- lazy var upLoadView: UIView = {
- let bgView = UIView()
-
- let addImageView = UIImageView.createImageView(imageName: "add")
- bgView.addSubview(addImageView)
- addImageView.snp.makeConstraints { make in
- make.top.equalTo(0)
- make.centerX.equalToSuperview()
- make.width.height.equalTo(24)
- }
-
- let textLabel = UILabel.createLabel(text: "Upload Photo".localized,font: .font(size: 16),textColor: .white,textAlignment: .center,numberOfLines: 0)
- bgView.addSubview(textLabel)
- textLabel.snp.makeConstraints { make in
- make.top.equalTo(addImageView.snp.bottom).offset(16)
- make.leading.equalTo(18)
- make.trailing.equalTo(-18)
- }
-
- bgView.addSubview(subInfoLabel)
- subInfoLabel.snp.makeConstraints { make in
- make.top.equalTo(textLabel.snp.bottom).offset(8)
- make.leading.equalTo(18)
- make.trailing.equalTo(-18)
- make.bottom.equalToSuperview()
- }
-
- return bgView
- }()
- lazy var uploadImageView: UIImageView = {
- let uploadImageView = UIImageView()
- uploadImageView.contentMode = .scaleAspectFit
- return uploadImageView
- }()
-
-
- lazy var uploadImageBgView: UIView = {
-
- let bgView = UIView()
- bgView.addGestureRecognizer(UITapGestureRecognizer(target: self, action:#selector(clickBgView)))
- let bgImageView = UIImageView.createImageView(imageName: "ailist_upload_big_bg")
- bgImageView.contentMode = .scaleToFill
- bgView.addSubview(bgImageView)
- bgImageView.snp.makeConstraints { make in
- make.leading.bottom.trailing.top.equalTo(0)
- }
- bgView.addSubview(upLoadView)
- upLoadView.snp.makeConstraints { make in
- make.top.equalTo(244*kDesignScale)
- make.centerX.equalToSuperview()
- make.width.lessThanOrEqualTo(k_ScreenWidth - 80)
- }
- bgView.addSubview(uploadImageView)
- uploadImageView.snp.makeConstraints { make in
- make.top.leading.equalTo(0)
- make.bottom.trailing.equalTo(0)
- }
-
- return bgView
- }()
-
-
- lazy var deleteBtn: UIButton = {
- let deleteBtn = UIButton.createButton(backgroundImage: UIImage(named: "delete_redRound")) { [weak self] in
- guard let self = self else { return }
- upLoadImage = nil
- }
- deleteBtn.isHidden = true
- return deleteBtn
- }()
- lazy var segmentedView: BetterSegmentedControl = {
- let segmentedView = BetterSegmentedControl(
- frame: .zero,
- segments:
- LabelSegment.segments(
- withTitles: ["Female".localized,"Male".localized,"Random".localized],
- normalFont: .font(size: 12.0),
- normalTextColor: .white.withAlphaComponent(0.4),
- selectedFont: .font(size: 12.0),
- selectedTextColor: "#111111".uiColor),
- options:[.backgroundColor(.white.withAlphaComponent(0.1)),
- .indicatorViewBackgroundColor(.white),
- .indicatorViewInset(2),
- .cornerRadius(20.0),
- .animationSpringDamping(1.0)]
- )
- segmentedView.addTarget(self,action: #selector(segmentedControlValueChanged(_:)),for: .valueChanged)
- return segmentedView
- }()
- var additionalPrompt = ",female"
- @objc func segmentedControlValueChanged(_ sender: BetterSegmentedControl) {
- switch sender.index {
- case 0:
- additionalPrompt = ",female"//女
- case 1:
- additionalPrompt = ",male"//男
- default:
- additionalPrompt = ""
- }
- }
-
- override func createView() {
-
- addNormalNavBarView()
- setPageTitle(titleString)
- _ = setNavigationItem("", imageName: "replace_photo", direction: .right, action: #selector(clickNavRight))
-
- 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)
- }
-
- setUpStackView()
-
- let image = upLoadImage
- upLoadImage = image
-
- subInfoLabel.isHidden = true
- }
-
- override func dealThings() {
- kSetBtnVipIcon(btn: self.submitBtn, show: true)
- }
-
- }
- extension TSAIUploadPhotoVC {
-
- func setUpStackView(){
- //添加上传一大块
- cusStackView.addSubviewToStack(uploadImageBgView)
- uploadImageBgView.snp.makeConstraints { make in
- make.width.equalTo(k_ScreenWidth)
- make.height.equalTo(k_ScreenHeight-76-k_Height_safeAreaInsetsBottom()-k_Nav_Height)
- }
-
- // if generatorStyle == .catTohuman {
- // cusStackView.addSpacing(length: 9)
- // cusStackView.addSubviewToStackWhiteBoard(segmentedView, length: 46)
- // segmentedView.snp.makeConstraints { make in
- // make.width.equalTo(k_ScreenWidth-70)
- // make.height.equalTo(40)
- // make.center.equalToSuperview()
- // }
- // }else{
- //文字信息区域
- // cusStackView.addSubviewToStack(getTextInfoCell(text: "Single photo with face fully visible".localized))
- // cusStackView.addSpacing(length: lineSpacing)
- // cusStackView.addSubviewToStack(getTextInfoCell(text: "No group photos, covered faces, nudes".localized))
- // }
- }
-
- func getTextInfoCell(text:String) -> UIView {
-
- let bgView = UIView()
- let pointView = UIView()
- pointView.backgroundColor = .white.withAlphaComponent(0.7)
- pointView.cornerRadius = 1
- bgView.addSubview(pointView)
- pointView.snp.makeConstraints { make in
- make.top.equalTo(7)
- make.leading.equalTo(22)
- make.width.height.equalTo(2)
- }
- let textLabel1 = UILabel.createLabel(text: text,font: .font(size: 12),textColor: .white.withAlphaComponent(0.6),numberOfLines: 0)
- textLabel1.setLineSpacing(lineSpacing)
- bgView.addSubview(textLabel1)
- textLabel1.snp.makeConstraints { make in
- make.top.bottom.equalToSuperview()
- make.leading.equalTo(16+16)
- make.trailing.equalTo(-16)
- }
- return bgView
- }
-
- var generatingText:String{
- return "Generate".localized
- }
- }
- extension TSAIUploadPhotoVC {
- @objc func clickNavRight() {
- pickSinglePhoto()
- }
-
- @objc func clickBgView() {
- pickSinglePhoto()
- }
-
- func pickSinglePhoto() {
- // photoPickerManager.pickCustomSinglePhoto() { [weak self] image, errorString in
- // guard let self = self else { return }
- // if let errorString = errorString {
- // TSToastShared.showToast(text: errorString)
- // }else{
- // upLoadImage = image
- // }
- // }
- enterSelectPhotos(userDefaultsKey: generatorStyle.userDefaultsKey, maxBitSize: generatorStyle.imageMaxBitSize, config: generatorStyle.config) { [weak self] image in
- guard let self = self else { return }
- upLoadImage = image
- }
- }
- }
- extension TSAIUploadPhotoVC {
-
- func generateImage() {
- if kJudgeVip(externalBool: true, vc: self){ return } //判断 vip
- guard let upLoadImage = upLoadImage else { return }
- // if generatorStyle != .catTohuman {
- additionalPrompt = ""
- // }
- let gennerateVC = TSAIListPhotoGeneratorVC(generatorModel: TSAIListPhotoGeneratorModel(upLoadImage: upLoadImage, generatorStyle: generatorStyle,additionalPrompt: additionalPrompt)){ [weak self] model in
- TSRMShared.aiListDB.updateData(model)
- }
-
- kPresentModalVC(target: self, modelVC: gennerateVC,transitionStyle: .crossDissolve)
- }
- }
- extension TSAIUploadPhotoVC{
-
- func enterSelectPhotos(userDefaultsKey:String,maxBitSize:Int,config:TSAIListHintBaseVC.Config,complete: @escaping (UIImage)->Void){
- if userDefaultsKey.count == 0 {
- self.pickSinglePhoto(maxBitSize:maxBitSize,complete:complete)
- }else{
- TSAIListHintBaseVC.userDefaultsKey = userDefaultsKey
- if TSAIListHintBaseVC.isShowUploadImageHint{
- TSAIListHintBaseVC.isShowUploadImageHint = false
- self.presentModalHintVC(config:config,complete:complete)
- }else {
- self.pickSinglePhoto(maxBitSize:maxBitSize,complete:complete)
- }
- }
- }
-
-
- func presentModalHintVC(config:TSAIListHintBaseVC.Config,complete:@escaping (UIImage)->Void){
- hintBaseVC = TSAIListHintBaseVC(config: config) { [weak self] image in
- guard let self = self else { return }
- if let image = image {
- complete(image)
- }else{
- dePrint("图片异常")
- }
- kDelayMainShort {
- self.hintBaseVC.dismissPageVC()
- }
- }
- kPresentModalVC(target: self, modelVC: hintBaseVC,transitionStyle: .crossDissolve)
- }
-
- func pickSinglePhoto(maxBitSize:Int,complete: @escaping (UIImage)->Void) {
- // photoPickerManager.pickSinglePhoto(maxBitSize: maxBitSize) { [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 if let image = image {
- complete(image)
- }else{
- dePrint("图片异常")
- }
- kDelayMainShort {
- self.photoPickerManager.dismissPageVC()
- }
-
- }
- }
- }
|