|
@@ -0,0 +1,341 @@
|
|
|
+//
|
|
|
+// TSAIPhotoBrowsePageVC.swift
|
|
|
+// AIEmoji
|
|
|
+//
|
|
|
+// Created by 100Years on 2025/8/6.
|
|
|
+//
|
|
|
+import RealmSwift
|
|
|
+private let bottomViewH = 60+k_Height_safeAreaInsetsBottom()
|
|
|
+class TSAIPhotoBrowsePageVC: TSBaseVC {
|
|
|
+
|
|
|
+ var browserPageVC:TSAIPhotoBrowsePageViewVC
|
|
|
+ public init(dataItems: [Any], startIndex: Int = 0) {
|
|
|
+ browserPageVC = TSAIPhotoBrowsePageViewVC(dataItems: dataItems, startIndex: startIndex)
|
|
|
+ super.init()
|
|
|
+ }
|
|
|
+
|
|
|
+ @MainActor required init?(coder: NSCoder) {
|
|
|
+ fatalError("init(coder:) has not been implemented")
|
|
|
+ }
|
|
|
+
|
|
|
+ var deleteComplete:((TSActionInfoModel)->Void)?
|
|
|
+
|
|
|
+ var currentIndex:Int{
|
|
|
+ return browserPageVC.currentIndex
|
|
|
+ }
|
|
|
+
|
|
|
+ var currentModel:TSActionInfoModel?{
|
|
|
+ if let model = browserPageVC.dataItems.safeObj(At: currentIndex) as? TSActionInfoModel{
|
|
|
+ return model
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ lazy var bottomView: UIView = {
|
|
|
+ let bottom = 60+k_Height_safeAreaInsetsBottom()
|
|
|
+ let bottomView = UIView(frame: CGRectMake(0, k_ScreenHeight-bottomViewH, k_ScreenWidth, bottomViewH))
|
|
|
+ let colorView = UIView.creatColor(color: "#222222".uiColor)
|
|
|
+ colorView.frame = bottomView.bounds
|
|
|
+ colorView.cornersRound(radius: 20, corner: [.topLeft,.topRight])
|
|
|
+ bottomView.addSubview(colorView)
|
|
|
+
|
|
|
+ return bottomView
|
|
|
+ }()
|
|
|
+
|
|
|
+ //左边分享按钮
|
|
|
+ lazy var shareBtn: TSVerticalButton = {
|
|
|
+ let shareBtn = TSVerticalButton()
|
|
|
+ shareBtn.setUpButton(title: "Share".localized,
|
|
|
+ image: UIImage(named: "share"),
|
|
|
+ font: .font(size: 11),
|
|
|
+ titleColor: .white.withAlphaComponent(0.8)){ [weak self] in
|
|
|
+ guard let self = self else { return }
|
|
|
+ clickShare()
|
|
|
+ }
|
|
|
+ shareBtn.contentEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)
|
|
|
+ return shareBtn
|
|
|
+ }()
|
|
|
+
|
|
|
+ //保存按钮
|
|
|
+ lazy var bigSaveBtn: UIButton = {
|
|
|
+ let bigSaveBtn = kCreateNormalSubmitBtn(title: "Save".localized) { [weak self] in
|
|
|
+ guard let self = self else { return }
|
|
|
+ clickSubmitBtn()
|
|
|
+ }
|
|
|
+ bigSaveBtn.contentEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
|
|
|
+ bigSaveBtn.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
|
|
|
+ bigSaveBtn.frame = CGRectMake(0, 0, 252, 44)
|
|
|
+ bigSaveBtn.cornerRadius = 22.0
|
|
|
+ kSetBtnVipIcon(btn: bigSaveBtn, show: true)
|
|
|
+ return bigSaveBtn
|
|
|
+ }()
|
|
|
+
|
|
|
+ lazy var xBtn: UIButton = {
|
|
|
+ let xBtn = UIButton.createButton(image: UIImage(named: "close_gray")) { [weak self] in
|
|
|
+ guard let self = self else { return }
|
|
|
+ clickXBtn()
|
|
|
+ }
|
|
|
+ return xBtn
|
|
|
+ }()
|
|
|
+
|
|
|
+
|
|
|
+ lazy var deleteBtn: UIButton = {
|
|
|
+ let deleteBtn = UIButton.createButton(image: UIImage(named: "delete_bg_gray")) { [weak self] in
|
|
|
+ guard let self = self else { return }
|
|
|
+ showCustomAlert(message: "Are you sure to delete".localized, deleteHandler: { [weak self] in
|
|
|
+ guard let self = self else { return }
|
|
|
+ if let currentModel = currentModel {
|
|
|
+ deleteComplete?(currentModel)
|
|
|
+ browserPageVC.removePage(at: currentIndex, animated: true)
|
|
|
+ if browserPageVC.dataItems.count <= 0 {
|
|
|
+ self.clickXBtn()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ return deleteBtn
|
|
|
+ }()
|
|
|
+
|
|
|
+
|
|
|
+ override func createView() {
|
|
|
+ super.createView()
|
|
|
+
|
|
|
+ setNavBarViewHidden(true)
|
|
|
+
|
|
|
+
|
|
|
+ contentView.addSubview(browserPageVC.view)
|
|
|
+ browserPageVC.view.snp.makeConstraints { make in
|
|
|
+ make.leading.trailing.top.equalTo(0)
|
|
|
+ make.bottom.equalTo(-bottomViewH)
|
|
|
+ }
|
|
|
+ self.addChild(browserPageVC)
|
|
|
+
|
|
|
+ //关闭按钮
|
|
|
+ contentView.addSubview(xBtn)
|
|
|
+ xBtn.snp.makeConstraints { make in
|
|
|
+ make.top.equalTo(k_Height_StatusBar + 4)
|
|
|
+ make.leading.equalTo(16)
|
|
|
+ make.width.equalTo(36)
|
|
|
+ make.height.equalTo(36)
|
|
|
+ }
|
|
|
+
|
|
|
+ contentView.addSubview(deleteBtn)
|
|
|
+ deleteBtn.snp.makeConstraints { make in
|
|
|
+ make.top.equalTo(k_Height_StatusBar + 4)
|
|
|
+ make.trailing.equalTo(-16)
|
|
|
+ make.width.equalTo(36)
|
|
|
+ make.height.equalTo(36)
|
|
|
+ }
|
|
|
+
|
|
|
+ let bottomBtnTop:CGFloat = 8.0
|
|
|
+ contentView.addSubview(bottomView)
|
|
|
+ bottomView.addSubview(bigSaveBtn)
|
|
|
+ bigSaveBtn.snp.makeConstraints { make in
|
|
|
+ make.top.equalTo(bottomBtnTop)
|
|
|
+ make.trailing.equalTo(-16)
|
|
|
+ make.width.equalTo(252*kDesignScale)
|
|
|
+ make.height.equalTo(44)
|
|
|
+ }
|
|
|
+
|
|
|
+ bottomView.addSubview(shareBtn)
|
|
|
+ shareBtn.snp.makeConstraints { make in
|
|
|
+ make.top.equalTo(bottomBtnTop)
|
|
|
+ make.leading.equalTo(16)
|
|
|
+ make.width.equalTo(shareBtn.intrinsicContentSize.width)
|
|
|
+ make.height.equalTo(44)
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ override func dealThings() {
|
|
|
+ addPullDownClosePage()
|
|
|
+ }
|
|
|
+ @objc func clickSubmitBtn(){
|
|
|
+
|
|
|
+ guard let currentModel = currentModel else { return }
|
|
|
+ if currentModel.modelType != .example{
|
|
|
+ if kJudgeVip(externalBool: true,vc: self) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ let urlString = currentModel.response.resultUrl
|
|
|
+ if currentModel.isVideo {
|
|
|
+ TSDownloadManager.getDownLoadVideo(urlString: urlString) { url, _ in
|
|
|
+ if let url = url {
|
|
|
+ PhotoManagerShared.saveVideoToAlbum(videoURL: url) { success, error in
|
|
|
+ if success {
|
|
|
+ kSaveSuccesswShared.show(atView: self.view)
|
|
|
+ }else{
|
|
|
+ debugPrint(error)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ TSImageStoreTool.downloadImageWithProgress(urlString: urlString) { image in
|
|
|
+ if let image = image{
|
|
|
+ PhotoManagerShared.saveImageToAlbum(image) { success, error in
|
|
|
+ if success {
|
|
|
+ kSaveSuccesswShared.show(atView: self.view)
|
|
|
+ }else{
|
|
|
+ debugPrint(error)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func clickXBtn(){
|
|
|
+ pop()
|
|
|
+ }
|
|
|
+
|
|
|
+ func clickShare() {
|
|
|
+ guard let currentModel = currentModel else { return }
|
|
|
+
|
|
|
+ if currentModel.modelType != .example{
|
|
|
+ if kJudgeVip(externalBool: true,vc: self) { return }
|
|
|
+ }
|
|
|
+
|
|
|
+ let urlString = currentModel.response.resultUrl
|
|
|
+ if currentModel.isVideo {
|
|
|
+ TSDownloadManager.getDownLoadVideo(urlString: urlString) { url, _ in
|
|
|
+ if let url = url {
|
|
|
+ kShareContent(target: self, anyData: url)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ TSImageStoreTool.downloadImageWithProgress(urlString: urlString) { image in
|
|
|
+ if let image = image{
|
|
|
+ kShareContent(target: self, anyData: image)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ func reloadUI() {
|
|
|
+ guard let currentModel = currentModel else { return }
|
|
|
+ kSetBtnVipIcon(btn: bigSaveBtn, show: currentModel.modelType == .example)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class TSAIPhotoBrowsePageViewVC: 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,frame: self.view.frame)
|
|
|
+ }
|
|
|
+ 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,frame:CGRect) -> TSAIPhotoDetailsBrowserBaseVC {
|
|
|
+ if model.isVideo {
|
|
|
+ return TSAIPhotoDetailsBrowserVideoVC(model: model)
|
|
|
+ }else{
|
|
|
+ return TSAIPhotoDetailsBrowserImageVC(model: model)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+class TSAIPhotoDetailsBrowserImageVC: TSAIPhotoDetailsBrowserBaseVC {
|
|
|
+ lazy var netWorkImageView: UIImageView = UIImageView.createImageView()
|
|
|
+ lazy var vipImageView: UIImageView = {
|
|
|
+ let vipImageView = UIImageView.createImageView(imageName:"vip_side_icon")
|
|
|
+ vipImageView.contentMode = .scaleToFill
|
|
|
+ vipImageView.isHidden = true
|
|
|
+ return vipImageView
|
|
|
+ }()
|
|
|
+
|
|
|
+ override func createView() {
|
|
|
+ super.createView()
|
|
|
+ contentView.addSubview(netWorkImageView)
|
|
|
+ netWorkImageView.snp.makeConstraints { make in
|
|
|
+ make.edges.equalToSuperview()
|
|
|
+ }
|
|
|
+
|
|
|
+ netWorkImageView.addSubview(vipImageView)
|
|
|
+ vipImageView.snp.makeConstraints { make in
|
|
|
+ make.width.height.equalTo(40)
|
|
|
+ make.top.equalTo(-5)
|
|
|
+ make.trailing.equalTo(5)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ override func dealThings() {
|
|
|
+ if model.modelType == .example {
|
|
|
+ netWorkImageView.image = UIImage(named:model.response.resultUrl)
|
|
|
+ }else{
|
|
|
+ netWorkImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder: kPlaceholderImage)
|
|
|
+ }
|
|
|
+ vipImageView.isHidden = !model.response.vip
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class TSAIPhotoDetailsBrowserVideoVC: TSAIPhotoDetailsBrowserBaseVC {
|
|
|
+
|
|
|
+ var videoPlayerVC: TSAIListVideoPlayerVC?
|
|
|
+
|
|
|
+ override func createView() {
|
|
|
+ super.createView()
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ override func dealThings() {
|
|
|
+ self.videoPlayerVC?.view.removeFromSuperview()
|
|
|
+ self.contentView.removeAllSubViews()
|
|
|
+ self.videoPlayerVC = nil
|
|
|
+ self.videoPlayerVC = TSAIListVideoPlayerVC(videoURL: self.model.videoURL)
|
|
|
+ self.view.addSubview(self.videoPlayerVC!.view)
|
|
|
+ self.videoPlayerVC!.setControlsBottom(bottem: -20)
|
|
|
+ self.videoPlayerVC!.view.snp.remakeConstraints { make in
|
|
|
+ make.edges.equalToSuperview()
|
|
|
+ }
|
|
|
+ self.videoPlayerVC?.runloppPlay()
|
|
|
+ }
|
|
|
+
|
|
|
+ override func viewDidAppear(_ animated: Bool) {
|
|
|
+ super.viewDidAppear(animated)
|
|
|
+ self.videoPlayerVC?.runloppPlay()
|
|
|
+ }
|
|
|
+
|
|
|
+ override func viewDidDisappear(_ animated: Bool) {
|
|
|
+ super.viewDidDisappear(animated)
|
|
|
+ self.videoPlayerVC?.playPause()
|
|
|
+ }
|
|
|
+
|
|
|
+}
|