|
@@ -0,0 +1,272 @@
|
|
|
+//
|
|
|
+// TSAIPhotoDetailsBrowserPageVC.swift
|
|
|
+// TSLiveWallpaper
|
|
|
+//
|
|
|
+// Created by 100Years on 2025/8/4.
|
|
|
+//
|
|
|
+
|
|
|
+class TSAIPhotoDetailsBrowserPageVC: TSBaseVC {
|
|
|
+
|
|
|
+ var deleteBlock:((TSActionInfoModel)->Void)?
|
|
|
+ var browserPageVC:TSAIPhotoBrowserPageVC
|
|
|
+ public init(dataItems: [Any], startIndex: Int = 0) {
|
|
|
+ browserPageVC = TSAIPhotoBrowserPageVC(dataItems: dataItems, startIndex: startIndex)
|
|
|
+ super.init()
|
|
|
+ }
|
|
|
+
|
|
|
+ @MainActor required init?(coder: NSCoder) {
|
|
|
+ fatalError("init(coder:) has not been implemented")
|
|
|
+ }
|
|
|
+
|
|
|
+ lazy var shareBtn: TSVerticalButton = {
|
|
|
+ let shareBtn = TSVerticalButton()
|
|
|
+ shareBtn.setUpButton(title: "Share".localized,
|
|
|
+ image: .share,
|
|
|
+ font: .font(name:.ZillaSlab,size: 14,weight: .medium),
|
|
|
+ titleColor: .white,
|
|
|
+ autoMirrored: false){ [weak self] in
|
|
|
+ guard let self = self else { return }
|
|
|
+ clickShare()
|
|
|
+ }
|
|
|
+ shareBtn.contentEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)
|
|
|
+ shareBtn.titleLabel?.layer.shadowColor = UIColor.black.cgColor
|
|
|
+ shareBtn.titleLabel?.layer.shadowOffset = CGSize(width: 0, height: 2)
|
|
|
+ shareBtn.titleLabel?.layer.shadowRadius = 3
|
|
|
+ shareBtn.titleLabel?.layer.shadowOpacity = 0.4
|
|
|
+ shareBtn.titleLabel?.layer.masksToBounds = false
|
|
|
+ return shareBtn
|
|
|
+ }()
|
|
|
+
|
|
|
+ lazy var saveBtn: UIButton = {
|
|
|
+ let saveBtn = kCreateNormalSubmitBtn(title: "Save".localized) { [weak self] in
|
|
|
+ guard let self = self else { return }
|
|
|
+ clickSaveBtn()
|
|
|
+ }
|
|
|
+ return saveBtn
|
|
|
+ }()
|
|
|
+ var navRightBtn:UIButton = UIButton()
|
|
|
+
|
|
|
+ override func createView() {
|
|
|
+ addPullDownClosePage()
|
|
|
+ addNormalNavBarView()
|
|
|
+ setPageTitle("Result".localized)
|
|
|
+ navRightBtn = setNavigationItem("", imageName: "ai_delete", direction: .right, action: #selector(clickNavRight))
|
|
|
+ contentView.snp.updateConstraints { make in
|
|
|
+ make.top.equalTo(0)
|
|
|
+ }
|
|
|
+
|
|
|
+ self.addChild(browserPageVC)
|
|
|
+ contentView.addSubview(browserPageVC.view)
|
|
|
+
|
|
|
+ let bottomBtnTop:CGFloat = -12-k_Height_safeAreaInsetsBottom()
|
|
|
+ contentView.addSubview(shareBtn)
|
|
|
+ shareBtn.snp.makeConstraints { make in
|
|
|
+ make.leading.equalTo(16)
|
|
|
+ make.width.equalTo(shareBtn.intrinsicContentSize.width)
|
|
|
+ make.height.equalTo(48)
|
|
|
+ make.bottom.equalTo(bottomBtnTop)
|
|
|
+ }
|
|
|
+
|
|
|
+ contentView.addSubview(saveBtn)
|
|
|
+ saveBtn.snp.makeConstraints { make in
|
|
|
+ make.leading.equalTo(shareBtn.snp.trailing).offset(40)
|
|
|
+ make.trailing.equalTo(-16.0)
|
|
|
+ make.height.equalTo(48)
|
|
|
+ make.bottom.equalTo(bottomBtnTop)
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ override func createFrame() {
|
|
|
+ browserPageVC.view.snp.makeConstraints { make in
|
|
|
+ make.edges.equalToSuperview()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ override func dealThings() {
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+extension TSAIPhotoDetailsBrowserPageVC {
|
|
|
+
|
|
|
+ var currentIndex:Int{
|
|
|
+ return browserPageVC.currentIndex
|
|
|
+ }
|
|
|
+
|
|
|
+ var currentModel:TSActionInfoModel?{
|
|
|
+ if let model = browserPageVC.dataItems.safeObj(At: currentIndex) as? TSActionInfoModel{
|
|
|
+ return model
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ //保存功能
|
|
|
+ @objc func clickSaveBtn(){
|
|
|
+ guard let infoModel = currentModel else { return }
|
|
|
+ if infoModel.modelType != .example{
|
|
|
+ if kJudgeVip(externalBool: true, vc: self) { return } //判断 vip
|
|
|
+ }
|
|
|
+
|
|
|
+ if infoModel.isVideo{
|
|
|
+ TSDownloadManager.getDownLoadVideo(urlString: infoModel.response.resultUrl) { url, success in
|
|
|
+ if let url = url {
|
|
|
+ PhotoManagerShared.saveVideoToAlbum(videoURL: url) { [weak self] success, error in
|
|
|
+ guard let self = self else { return }
|
|
|
+ if success {
|
|
|
+ kSaveSuccesswShared.show(atView:self.view)
|
|
|
+ }else{
|
|
|
+ debugPrint(error)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ if let image = TSImagePhotoDiskTool.getLocalImage(urlString: infoModel.response.resultUrl){
|
|
|
+ PhotoManagerShared.saveImageToAlbum(image) { [weak self] success, error in
|
|
|
+ guard let self = self else { return }
|
|
|
+ if success {
|
|
|
+ kSaveSuccesswShared.show(atView:self.view)
|
|
|
+ }else{
|
|
|
+ debugPrint(error)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ func clickShare() {
|
|
|
+ guard let infoModel = currentModel else { return }
|
|
|
+ if infoModel.modelType != .example{
|
|
|
+ if kJudgeVip(externalBool: true, vc: self) { return } //判断 vip
|
|
|
+ }
|
|
|
+ if infoModel.isVideo{
|
|
|
+ TSDownloadManager.getDownLoadVideo(urlString: infoModel.response.resultUrl) { url, success in
|
|
|
+ if let url = url {
|
|
|
+ kShareContent(target: self, anyData: url)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ if let image = TSImagePhotoDiskTool.getLocalImage(urlString: infoModel.response.resultUrl){
|
|
|
+ kShareContent(target: self, anyData: image)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func clickNavRight() {
|
|
|
+ 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 }
|
|
|
+ if let currentModel = currentModel {
|
|
|
+ self.deleteBlock?(currentModel)
|
|
|
+ }
|
|
|
+
|
|
|
+ browserPageVC.removePage(at: currentIndex, animated: true)
|
|
|
+ if browserPageVC.dataItems.count <= 0 {
|
|
|
+ self.navBarClickLeftAction()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ))
|
|
|
+ }
|
|
|
+
|
|
|
+ func reloadUI() {
|
|
|
+ guard let currentModel = currentModel else { return }
|
|
|
+ kSetBtnVipIcon(btn: saveBtn, show: currentModel.modelType == .normal)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class TSAIPhotoBrowserPageVC: TSBasePageVC {
|
|
|
+ override func viewController(at index: Int) -> UIViewController? {
|
|
|
+ guard index >= 0 && index < dataItems.count else { return nil }
|
|
|
+ if let model = dataItems[index] as? TSActionInfoModel {
|
|
|
+ return TSAIPhotoDetailsBrowserBaseVC.createBrowserVC(with: model)
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ override func indexOfViewController(_ viewController: UIViewController) -> Int? {
|
|
|
+ guard let vc = viewController as? TSAIPhotoDetailsBrowserBaseVC,
|
|
|
+ let index = dataItems.firstIndex(where: { ($0 as? TSActionInfoModel) == vc.model }) else {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ return index
|
|
|
+ }
|
|
|
+
|
|
|
+ override func dealThings() {
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class TSAIPhotoDetailsBrowserBaseVC: TSBaseVC {
|
|
|
+
|
|
|
+ var model:TSActionInfoModel
|
|
|
+
|
|
|
+ init(model: TSActionInfoModel) {
|
|
|
+ self.model = model
|
|
|
+ super.init()
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @MainActor required init?(coder: NSCoder) {
|
|
|
+ fatalError("init(coder:) has not been implemented")
|
|
|
+ }
|
|
|
+
|
|
|
+ override func createView() {
|
|
|
+ setNavBarViewHidden(true)
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 工厂方法
|
|
|
+ static func createBrowserVC(with model: TSActionInfoModel) -> TSAIPhotoDetailsBrowserBaseVC {
|
|
|
+ if model.isVideo {
|
|
|
+ return TSAIPhotoDetailsBrowserVideoVC(model: model)
|
|
|
+ }else{
|
|
|
+ return TSAIPhotoDetailsBrowserImageVC(model: model)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+class TSAIPhotoDetailsBrowserImageVC: TSAIPhotoDetailsBrowserBaseVC {
|
|
|
+ lazy var netWorkImageView: UIImageView = UIImageView.createImageView()
|
|
|
+
|
|
|
+ override func createView() {
|
|
|
+ super.createView()
|
|
|
+
|
|
|
+ contentView.addSubview(netWorkImageView)
|
|
|
+ netWorkImageView.snp.makeConstraints { make in
|
|
|
+ make.edges.equalToSuperview()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ override func dealThings() {
|
|
|
+ netWorkImageView.image = TSImagePhotoDiskTool.getLocalImage(urlString: model.response.resultUrl)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class TSAIPhotoDetailsBrowserVideoVC: TSAIPhotoDetailsBrowserBaseVC {
|
|
|
+
|
|
|
+ lazy var netWorkImageView: UIImageView = UIImageView.createImageView()
|
|
|
+ var videoPlayerVC: TSAIListVideoPlayerVC?
|
|
|
+
|
|
|
+ override func createView() {
|
|
|
+ super.createView()
|
|
|
+
|
|
|
+ self.videoPlayerVC = TSAIListVideoPlayerVC(videoURL: self.model.response.videoURL)
|
|
|
+ self.contentView.addSubview(self.videoPlayerVC!.view)
|
|
|
+ self.videoPlayerVC!.view.snp.remakeConstraints { make in
|
|
|
+ make.center.equalToSuperview()
|
|
|
+ make.width.equalTo(k_ScreenWidth)
|
|
|
+ make.height.equalTo(k_ScreenHeight)
|
|
|
+ }
|
|
|
+ self.videoPlayerVC?.runloppPlay()
|
|
|
+ }
|
|
|
+
|
|
|
+}
|