123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- //
- // TSAIListHintBaseVC.swift
- // AIEmoji
- //
- // Created by 100Years on 2025/4/9.
- //
- import PhotosUI
- class TSAIListHintBaseVC: TSBaseVC {
- static var userDefaultsKey:String = "isFirstAIListAge"
-
- struct Config {
- var imageMaxBitSize:Int
- var goodImageNamed:String
- var badImageNamed:String
- var titleText:String
- var titleSubText:String
-
- var goodText:String
- var goodInfoText:String
-
- var badText:String
- var badInfoText:String
-
-
- init(imageMaxBitSize: Int, goodImageNamed: String, badImageNamed: String, titleText: String, titleSubText: String, goodText: String, goodInfoText: String, badText: String, badInfoText: String) {
- self.imageMaxBitSize = imageMaxBitSize
- self.goodImageNamed = goodImageNamed
- self.badImageNamed = badImageNamed
- self.titleText = titleText
- self.titleSubText = titleSubText
- self.goodText = goodText
- self.goodInfoText = goodInfoText
- self.badText = badText
- self.badInfoText = badInfoText
- }
-
- // static func getDefaultConfig(imageMaxBitSize:Int) -> Config {
- // var config = defaultConfig
- // config.imageMaxBitSize = imageMaxBitSize
- // return config
- // }
-
- static var enhanceConfig:Config {
- return Config(imageMaxBitSize: kUploadImageMaxBit5Size,
- goodImageNamed: "hint_Enhance_good",
- badImageNamed: "hint_Enhance_bad",
- titleText: "Enhance Tips".localized,
- titleSubText: "",
- goodText: "Suitable".localized,
- goodInfoText: "Portraits, Low-resolution and photos, faces should be visible".localized,
- badText: "Unsuitable".localized,
- badInfoText: "High resulotion, Severaly damaged and Difficult to recognize the face".localized)
- }
-
- static var colorizeConfig:Config {
- return Config(imageMaxBitSize: kUploadImageMaxBit10Size,
- goodImageNamed: "hint_Colorize_good",
- badImageNamed: "hint_Colorize_bad",
- titleText: "Colorize Tips".localized,
- titleSubText: "",
- goodText: "Suitable".localized,
- goodInfoText: "Clear outline black-and-white photos".localized,
- badText: "Unsuitable".localized,
- badInfoText: "Colorful or Severely damaged photos".localized)
- }
-
-
- static var descratchConfig:Config {
- return Config(imageMaxBitSize: kUploadImageMaxBit10Size,
- goodImageNamed: "hint_Descratch_good",
- badImageNamed: "hint_Descratch_bad",
- titleText: "Descratch Tips".localized,
- titleSubText: "",
- goodText: "Suitable".localized,
- goodInfoText: "Scratched and Damaged photos".localized,
- badText: "Unsuitable".localized,
- badInfoText: "High-resolution, Not damaged, and Clear photos".localized)
- }
-
- static var enlightenConfig:Config {
- return Config(imageMaxBitSize: kUploadImageMaxBit10Size,
- goodImageNamed: "hint_Enlighten_good",
- badImageNamed: "hint_Enlighten_bad",
- titleText: "Enlighten Tips".localized,
- titleSubText: "",
- goodText: "Suitable".localized,
- goodInfoText: "Over-dark or over-light, overexposed, or underexposed photos".localized,
- badText: "Unsuitable".localized,
- badInfoText: "Well-exposed or severely damaged photos".localized)
- }
-
- static var recreateConfig:Config {
- return Config(imageMaxBitSize: kUploadImageMaxBit10Size,
- goodImageNamed: "hint_Descratch_good",
- badImageNamed: "hint_Enhance_bad",
- titleText: "Recreate Tips".localized,
- titleSubText: "",
- goodText: "Suitable".localized,
- goodInfoText: "Portraits, Low-resolution and photos, faces should be visible".localized,
- badText: "Unsuitable".localized,
- badInfoText: "High resulotion, Severaly damaged and Difficult to recognize the face".localized)
- }
- }
-
- var config:Config = Config.enhanceConfig
- init(config: Config, clickUpImageHandle: ((UIImage?) -> Void)? = nil) {
- self.config = config
- self.clickUpImageHandle = clickUpImageHandle
- super.init()
- }
-
- @MainActor required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
-
- var clickUpImageHandle:((UIImage?)->Void)?
- lazy var popupContentView: UIView = {
- let popupContentView = UIView()
- popupContentView.backgroundColor = .clear
- return popupContentView
- }()
-
- lazy var photoPickerManager: TSPhotoPickerManager = {
- let photoPickerManager = TSPhotoPickerManager(viewController: self)
- return photoPickerManager
- }()
-
- lazy var submitBtn: UIButton = {
- let submitBtn = kCreateNormalSubmitBtn(title: "Upload Photo".localized) { [weak self] in
- guard let self = self else { return }
- pickSinglePhoto()
- }
- return submitBtn
- }()
-
- override func createView() {
- addNormalNavBarView()
- _ = setNavigationItem("", imageName: "ic-close", direction: .right, action: #selector(clickView))
- view.backgroundColor = .mainBg
-
- contentView.addSubview(popupContentView)
- popupContentView.center = view.center
-
- popupContentView.snp.makeConstraints { make in
- make.top.equalTo(0)
- make.bottom.equalTo(0)
- make.leading.equalTo(28)
- make.trailing.equalTo(-28)
- }
-
- setUpUI()
- }
-
- @objc func clickView() {
- dismiss(animated: true)
- }
-
-
- func setUpUI(){
- let iconImageView:UIImageView = UIImageView.createImageView(image: .hint)
- popupContentView.addSubview(iconImageView)
- iconImageView.snp.makeConstraints { make in
- make.top.equalTo(16)
- make.leading.equalTo(0)
- make.width.height.equalTo(40)
- }
-
- let fullText = config.titleText+config.titleSubText
- let attString = NSMutableAttributedString(string: fullText)
- // let mainRange = NSRange(location: 0, length: config.titleText.count)
- attString.addAttributes([.font:UIFont.font(name:.ZillaSlab ,size: 26,weight: .bold),.foregroundColor:UIColor.white], range: NSRange(location: 0, length: config.titleText.count))
- attString.addAttributes([.font:UIFont.font(size: 12),.foregroundColor:UIColor.white.withAlphaComponent(0.6)], range: NSRange(location: config.titleText.count, length: config.titleSubText.count))
- let titleLabel = UILabel.createLabel(numberOfLines: 0)
- titleLabel.attributedText = attString
- popupContentView.addSubview(titleLabel)
- titleLabel.snp.makeConstraints { make in
- make.leading.equalTo(0)
- make.top.equalTo(iconImageView.snp.bottom).offset(24)
- }
-
- let goodImageView = UIImageView.createImageView(imageName: config.goodImageNamed)
- popupContentView.addSubview(goodImageView)
- goodImageView.snp.makeConstraints { make in
- make.top.equalTo(titleLabel.snp.bottom).offset(32)
- make.leading.equalTo(0)
- make.trailing.equalTo(0)
- make.height.equalTo(112*kDesignScale)
- }
-
- let goodLabel = UILabel.createLabel(text: config.goodText,font: .font(size: 16,weight: .medium),textColor: .white,numberOfLines: 0)
- popupContentView.addSubview(goodLabel)
- goodLabel.snp.makeConstraints { make in
- make.top.equalTo(goodImageView.snp.bottom).offset(12)
- make.leading.equalTo(0)
- make.trailing.equalTo(0)
- }
-
- let goodInfoLabel = UILabel.createLabel(text: config.goodInfoText,font: .font(size: 14),textColor: .white.withAlphaComponent(0.6),numberOfLines: 0)
- popupContentView.addSubview(goodInfoLabel)
- goodInfoLabel.snp.makeConstraints { make in
- make.top.equalTo(goodLabel.snp.bottom).offset(8)
- make.leading.equalTo(0)
- make.trailing.equalTo(0)
- }
-
- let badImageView = UIImageView.createImageView(imageName: config.badImageNamed)
- popupContentView.addSubview(badImageView)
- badImageView.snp.makeConstraints { make in
- make.top.equalTo(goodInfoLabel.snp.bottom).offset(20)
- make.leading.equalTo(0)
- make.trailing.equalTo(0)
- make.height.equalTo(112*kDesignScale)
- }
-
- let badLabel = UILabel.createLabel(text: config.badText,font: .font(size: 16,weight: .medium),textColor: .white,numberOfLines: 0)
- popupContentView.addSubview(badLabel)
- badLabel.snp.makeConstraints { make in
- make.top.equalTo(badImageView.snp.bottom).offset(12)
- make.leading.equalTo(0)
- make.trailing.equalTo(0)
- }
-
- let badInfoLabel = UILabel.createLabel(text: config.badInfoText,font: .font(size: 14),textColor: .white.withAlphaComponent(0.6),numberOfLines: 0)
- popupContentView.addSubview(badInfoLabel)
- badInfoLabel.snp.makeConstraints { make in
- make.top.equalTo(badLabel.snp.bottom).offset(8)
- make.leading.equalTo(0)
- make.trailing.equalTo(0)
- }
-
- popupContentView.addSubview(submitBtn)
- submitBtn.snp.makeConstraints { make in
- make.centerX.equalToSuperview()
- make.width.equalTo(248*kDesignScale)
- make.height.equalTo(48)
- make.bottom.equalTo(-43-k_Height_safeAreaInsetsBottom())
- }
- }
- static var isShowUploadImageHint:Bool{
- get {
- return UserDefaults.standard.string(forKey: userDefaultsKey) == nil
- }
-
- set {
- UserDefaults.standard.set(newValue ? nil : "1", forKey: userDefaultsKey)
- UserDefaults.standard.synchronize()
- }
- }
-
- func pickSinglePhoto() {
- photoPickerManager.pickCustomSinglePhoto() { [weak self] image, errorString in
- guard let self = self else { return }
- if let errorString = errorString {
- TSToastShared.showToast(text: errorString)
- }else{
- self.clickUpImageHandle?(image)
- }
- }
-
-
- }
-
- func dismissPageVC(){
- self.view.isHidden = true
- self.photoPickerManager.dismissPageVC()
- self.dismiss(animated: true)
- }
- }
|