From b018486f213e4efa81bbe4ef097266a682b90d32 Mon Sep 17 00:00:00 2001 From: zjx Date: Tue, 10 Jun 2025 10:34:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A0=E6=95=B0=E6=8D=AE=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Veloria.xcodeproj/project.pbxproj | 4 + Veloria/Base/Networking/API/VPWalletAPI.swift | 2 +- .../Class/Home/View/VPSearchResultView.swift | 2 +- Veloria/Class/Me/View/VPMeToolCell.swift | 2 +- .../VPDetailPlayerViewController.swift | 11 ++- .../Player/View/VPPlayerCoinBuyView.swift | 5 +- .../Player/View/VPPlayerRechargeView.swift | 26 ++++-- .../Player/View/VPPlayerVipBuyView.swift | 6 +- Veloria/Libs/Empty/UIScrollView+Empty.swift | 13 ++- Veloria/Libs/Empty/VPEmptyView.swift | 86 +++++++++++++++++++ Veloria/Source/en.lproj/Localizable.strings | 5 +- 11 files changed, 143 insertions(+), 19 deletions(-) create mode 100644 Veloria/Libs/Empty/VPEmptyView.swift diff --git a/Veloria.xcodeproj/project.pbxproj b/Veloria.xcodeproj/project.pbxproj index b9ec04b..ee3076c 100644 --- a/Veloria.xcodeproj/project.pbxproj +++ b/Veloria.xcodeproj/project.pbxproj @@ -219,6 +219,7 @@ BFF5B2772DF2CA4B0044227A /* VPDetailRecommandBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5B2762DF2CA4B0044227A /* VPDetailRecommandBannerCell.swift */; }; BFF5B2792DF679720044227A /* VPMoreVideoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5B2782DF679720044227A /* VPMoreVideoViewController.swift */; }; BFF5B4AF2DF6B6630044227A /* VPMutualCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5B4AE2DF6B6630044227A /* VPMutualCollectionView.swift */; }; + BFF5B6E52DF7C8590044227A /* VPEmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5B6E42DF7C8580044227A /* VPEmptyView.swift */; }; F939C04AD4003BA127F15C28 /* Pods_Veloria.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34F57E87E765BF8D72A43DCA /* Pods_Veloria.framework */; }; /* End PBXBuildFile section */ @@ -443,6 +444,7 @@ BFF5B2762DF2CA4B0044227A /* VPDetailRecommandBannerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPDetailRecommandBannerCell.swift; sourceTree = ""; }; BFF5B2782DF679720044227A /* VPMoreVideoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPMoreVideoViewController.swift; sourceTree = ""; }; BFF5B4AE2DF6B6630044227A /* VPMutualCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPMutualCollectionView.swift; sourceTree = ""; }; + BFF5B6E42DF7C8580044227A /* VPEmptyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPEmptyView.swift; sourceTree = ""; }; E0BDA3570E00C90877E45AA0 /* Pods-VideoPlayer.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VideoPlayer.debug.xcconfig"; path = "Target Support Files/Pods-VideoPlayer/Pods-VideoPlayer.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -1070,6 +1072,7 @@ isa = PBXGroup; children = ( BF5E75B52DE46DB600DE9DFE /* UIScrollView+Empty.swift */, + BFF5B6E42DF7C8580044227A /* VPEmptyView.swift */, ); path = Empty; sourceTree = ""; @@ -1536,6 +1539,7 @@ BF5E75B82DE46F7100DE9DFE /* VPNetworkReachabilityManager.swift in Sources */, BFF5B26A2DF170DD0044227A /* VPIAPVerifyModel.swift in Sources */, BF0FA6D52DDC5B5D00C9E5F2 /* VPApi.swift in Sources */, + BFF5B6E52DF7C8590044227A /* VPEmptyView.swift in Sources */, BF0FA7C12DE45D5D00C9E5F2 /* VPUserInfo.swift in Sources */, BF0FA7392DDECF8900C9E5F2 /* VPHomeListViewController.swift in Sources */, BFF5AFB42DE7FF4E0044227A /* VPCoinsViewController.swift in Sources */, diff --git a/Veloria/Base/Networking/API/VPWalletAPI.swift b/Veloria/Base/Networking/API/VPWalletAPI.swift index 08a22f8..14dc2a7 100644 --- a/Veloria/Base/Networking/API/VPWalletAPI.swift +++ b/Veloria/Base/Networking/API/VPWalletAPI.swift @@ -61,7 +61,7 @@ class VPWalletAPI { param.parameters = [ "page_size" : 20, "current_page" : page, - "buy_type" : buyType.rawValue + "buy_type" : buyType == .subVip ? "vip" : buyType.rawValue ] VPNetwork.request(parameters: param) { (response: VPNetworkResponse>) in diff --git a/Veloria/Class/Home/View/VPSearchResultView.swift b/Veloria/Class/Home/View/VPSearchResultView.swift index 8f22116..f55f786 100644 --- a/Veloria/Class/Home/View/VPSearchResultView.swift +++ b/Veloria/Class/Home/View/VPSearchResultView.swift @@ -42,7 +42,7 @@ class VPSearchResultView: UIView { collectionView.dataSource = self collectionView.contentInset = .init(top: 0, left: 0, bottom: UIScreen.tabbarSafeBottomMargin + 10, right: 0) collectionView.register(VPSearchResultCell.self, forCellWithReuseIdentifier: "cell") - collectionView.vp_addNormalEmpty(image: UIImage(named: "empty_image_02")) + collectionView.vp_addNormalEmpty(image: UIImage(named: "empty_image_02"), title: "kEmptyTitle02".localized, des: "kEmptyDes02".localized) collectionView.keyboardDismissMode = .onDrag return collectionView }() diff --git a/Veloria/Class/Me/View/VPMeToolCell.swift b/Veloria/Class/Me/View/VPMeToolCell.swift index c0b706f..b29d8d9 100644 --- a/Veloria/Class/Me/View/VPMeToolCell.swift +++ b/Veloria/Class/Me/View/VPMeToolCell.swift @@ -11,7 +11,7 @@ class VPMeToolCell: VPTableViewCell { private lazy var stackView: UIStackView = { - let view = UIStackView(arrangedSubviews: [walletButton, storeButton, rewardsButton, favoritesButton]) + let view = UIStackView(arrangedSubviews: [walletButton, storeButton, /*rewardsButton,*/ favoritesButton]) view.axis = .horizontal view.distribution = .fillEqually view.alignment = .center diff --git a/Veloria/Class/Player/Controller/VPDetailPlayerViewController.swift b/Veloria/Class/Player/Controller/VPDetailPlayerViewController.swift index 63faf22..7bfbfbb 100644 --- a/Veloria/Class/Player/Controller/VPDetailPlayerViewController.swift +++ b/Veloria/Class/Player/Controller/VPDetailPlayerViewController.swift @@ -223,6 +223,10 @@ extension VPDetailPlayerViewController { let view = VPPlayerRechargeView() view.shortPlayId = videoInfo.short_play_id view.videoId = videoInfo.short_play_video_id + view.buyFinishBlock = { [weak self] in + guard let self = self else { return } + self.requestDetailData(indexPath: self.currentIndexPath) + } view.present(in: nil) } @@ -330,7 +334,7 @@ extension VPDetailPlayerViewController { extension VPDetailPlayerViewController { - private func requestDetailData() { + private func requestDetailData(indexPath: IndexPath? = nil) { guard let shortPlayId = shortPlayId else { return } isShowRecommand = false @@ -350,7 +354,10 @@ extension VPDetailPlayerViewController { self.reloadData { [weak self] in guard let self = self else { return } - if let videoInfo = self.detailModel?.video_info { + if let indexPath = indexPath { + self.scrollToItem(indexPath: indexPath, animated: false) + + } else if let videoInfo = self.detailModel?.video_info { var row: Int? self.detailModel?.episodeList?.enumerated().forEach({ if $1.id == videoInfo.id { diff --git a/Veloria/Class/Player/View/VPPlayerCoinBuyView.swift b/Veloria/Class/Player/View/VPPlayerCoinBuyView.swift index 83275d4..ad4265b 100644 --- a/Veloria/Class/Player/View/VPPlayerCoinBuyView.swift +++ b/Veloria/Class/Player/View/VPPlayerCoinBuyView.swift @@ -18,6 +18,7 @@ class VPPlayerCoinBuyView: UIView { var shortPlayId: String? var videoId: String? + var buyFinishBlock: (() -> Void)? private lazy var selectedIndex = 0 @@ -104,9 +105,11 @@ extension VPPlayerCoinBuyView: UICollectionViewDelegate, UICollectionViewDataSou self.selectedIndex = indexPath.row collectionView.reloadData() - VPIAPManager.manager.start(model: dataArr[indexPath.row], shortPlayId: self.shortPlayId, videoId: self.videoId) { finish in + VPIAPManager.manager.start(model: dataArr[indexPath.row], shortPlayId: self.shortPlayId, videoId: self.videoId) { [weak self] finish in + guard let self = self else { return } if finish { VPLoginManager.manager.updateUserInfo(completer: nil) + self.buyFinishBlock?() } } } diff --git a/Veloria/Class/Player/View/VPPlayerRechargeView.swift b/Veloria/Class/Player/View/VPPlayerRechargeView.swift index 77596d2..6cc865a 100644 --- a/Veloria/Class/Player/View/VPPlayerRechargeView.swift +++ b/Veloria/Class/Player/View/VPPlayerRechargeView.swift @@ -22,6 +22,8 @@ class VPPlayerRechargeView: HWPanModalContentView { } } + var buyFinishBlock: (() -> Void)? + //MARK: UI属性 private lazy var bgView: UIImageView = { let imageView = UIImageView(image: UIImage(named: "bg_image_01")) @@ -53,11 +55,21 @@ class VPPlayerRechargeView: HWPanModalContentView { private lazy var vipView: VPPlayerVipBuyView = { let view = VPPlayerVipBuyView() + view.buyFinishBlock = { [weak self] in + self?.buyFinishBlock?() + self?.dismiss(animated: true) { + } + } return view }() private lazy var coinView: VPPlayerCoinBuyView = { let view = VPPlayerCoinBuyView() + view.buyFinishBlock = { [weak self] in + self?.buyFinishBlock?() + self?.dismiss(animated: true) { + } + } return view }() @@ -68,7 +80,7 @@ class VPPlayerRechargeView: HWPanModalContentView { override init(frame: CGRect) { super.init(frame: frame) NotificationCenter.default.addObserver(self, selector: #selector(updateCoin), name: VPLoginManager.userInfoUpdateNotification, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(buyVipFinishNotification), name: VPIAPManager.buyVipFinishNotification, object: nil) +// NotificationCenter.default.addObserver(self, selector: #selector(buyVipFinishNotification), name: VPIAPManager.buyVipFinishNotification, object: nil) vp_setupUI() @@ -143,12 +155,12 @@ extension VPPlayerRechargeView { coinLabel.attributedText = string } - @objc private func buyVipFinishNotification() { - if VPLoginManager.manager.userInfo?.is_vip == true { - self.dismiss(animated: true) { - } - } - } +// @objc private func buyVipFinishNotification() { +// if VPLoginManager.manager.userInfo?.is_vip == true { +// self.dismiss(animated: true) { +// } +// } +// } } extension VPPlayerRechargeView { diff --git a/Veloria/Class/Player/View/VPPlayerVipBuyView.swift b/Veloria/Class/Player/View/VPPlayerVipBuyView.swift index 49b429b..bc1df61 100644 --- a/Veloria/Class/Player/View/VPPlayerVipBuyView.swift +++ b/Veloria/Class/Player/View/VPPlayerVipBuyView.swift @@ -18,6 +18,8 @@ class VPPlayerVipBuyView: UIView { var shortPlayId: String? var videoId: String? + var buyFinishBlock: (() -> Void)? + private lazy var currentIndex: Int = 0 private lazy var collectionViewLayout: UICollectionViewFlowLayout = { @@ -143,9 +145,11 @@ extension VPPlayerVipBuyView: UICollectionViewDelegate, UICollectionViewDataSour self.collectionView.reloadData() } - VPIAPManager.manager.start(model: dataArr[indexPath.row], shortPlayId: self.shortPlayId, videoId: self.videoId) { finish in + VPIAPManager.manager.start(model: dataArr[indexPath.row], shortPlayId: self.shortPlayId, videoId: self.videoId) { [weak self] finish in + guard let self = self else { return } if finish { VPLoginManager.manager.updateUserInfo(completer: nil) + self.buyFinishBlock?() } } } diff --git a/Veloria/Libs/Empty/UIScrollView+Empty.swift b/Veloria/Libs/Empty/UIScrollView+Empty.swift index dcfd3c7..fedbbe7 100644 --- a/Veloria/Libs/Empty/UIScrollView+Empty.swift +++ b/Veloria/Libs/Empty/UIScrollView+Empty.swift @@ -9,12 +9,17 @@ import UIKit import EmptyDataSet_Swift extension UIScrollView { - func vp_addNormalEmpty(image: UIImage? = UIImage(named: "empty_image_01"), title: String? = nil, titleColor: UIColor? = nil) { + func vp_addNormalEmpty(image: UIImage? = UIImage(named: "empty_image_01"), title: String? = "kEmptyTitle01".localized, des: String? = "kEmptyDes01".localized) { + + let emptyView = VPEmptyView() + emptyView.image = image + emptyView.title = title + emptyView.des = des self.emptyDataSetView { view in - view.image(image) - .isScrollAllowed(true) - .verticalOffset(-100) + view.customView(emptyView) + .verticalOffset(-130) + } } } diff --git a/Veloria/Libs/Empty/VPEmptyView.swift b/Veloria/Libs/Empty/VPEmptyView.swift new file mode 100644 index 0000000..9d14a43 --- /dev/null +++ b/Veloria/Libs/Empty/VPEmptyView.swift @@ -0,0 +1,86 @@ +// +// VPEmptyView.swift +// Veloria +// +// Created by 湖南秦九 on 2025/6/10. +// + +import UIKit + +class VPEmptyView: UIView { + + var image: UIImage? { + didSet { + imageView.image = image + } + } + + var title: String? { + didSet { + titleLabel.text = title + } + } + + var des: String? { + didSet { + desLabel.text = des + } + } + + private lazy var imageView: UIImageView = { + let imageView = UIImageView() + return imageView + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .fontMedium(ofSize: 17) + label.textColor = .color05CEA0() + return label + }() + + private lazy var desLabel: UILabel = { + let label = UILabel() + label.font = .fontRegular(ofSize: 15) + label.textColor = .colorE5E5E5() + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + vp_setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension VPEmptyView { + + private func vp_setupUI() { + addSubview(imageView) + addSubview(titleLabel) + addSubview(desLabel) + + imageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalToSuperview() + } + + titleLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.bottom.equalTo(imageView).offset(-18) + } + + desLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalTo(titleLabel.snp.bottom).offset(15) + make.bottom.equalToSuperview() + } + + } + +} diff --git a/Veloria/Source/en.lproj/Localizable.strings b/Veloria/Source/en.lproj/Localizable.strings index e32c7ac..47b3cf7 100644 --- a/Veloria/Source/en.lproj/Localizable.strings +++ b/Veloria/Source/en.lproj/Localizable.strings @@ -90,7 +90,10 @@ "Watch Now" = "Watch Now"; "More" = "More"; - +"kEmptyTitle01" = "Nothing Here Yet"; +"kEmptyDes01" = "Start exploring and add something!"; +"kEmptyTitle02" = "Not Found"; +"kEmptyDes02" = "Sorry, we couldn't find anything."; "kDetailRecommandTitle" = "Picked Just for You"; "kHomeTitleText" = "10,000+ addictive shorts await!"; "kSearchPlaceholderText1" = "Search dramas";