钱包页面开发

This commit is contained in:
zjx 2025-05-30 18:14:24 +08:00
parent cbac290cf7
commit c10ccac600
30 changed files with 890 additions and 1 deletions

View File

@ -163,6 +163,14 @@
BFF5AFC42DE84F9C0044227A /* Aa厚底黑.ttf in Resources */ = {isa = PBXBuildFile; fileRef = BFF5AFC32DE84F9C0044227A /* Aa厚底黑.ttf */; };
BFF5AFC62DE863C00044227A /* VPGradientButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFC52DE863C00044227A /* VPGradientButton.swift */; };
BFF5AFC82DE9473B0044227A /* VPCoinsBuyCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFC72DE9473B0044227A /* VPCoinsBuyCell.swift */; };
BFF5AFCA2DE97B7A0044227A /* VPWalletViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFC92DE97B7A0044227A /* VPWalletViewController.swift */; };
BFF5AFCC2DE98C7F0044227A /* VPOrderRecordsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFCB2DE98C7F0044227A /* VPOrderRecordsViewController.swift */; };
BFF5AFCE2DE99C730044227A /* VPCoinRecordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFCD2DE99C730044227A /* VPCoinRecordViewController.swift */; };
BFF5AFD02DE9A0370044227A /* VPCoinRecordCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFCF2DE9A0370044227A /* VPCoinRecordCell.swift */; };
BFF5AFD22DE9A58A0044227A /* VPVIPRecordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFD12DE9A58A0044227A /* VPVIPRecordViewController.swift */; };
BFF5AFD42DE9A5FB0044227A /* VPVIPRecordCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFD32DE9A5FB0044227A /* VPVIPRecordCell.swift */; };
BFF5AFD62DE9A8D70044227A /* VPWalletHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFD52DE9A8D70044227A /* VPWalletHeaderView.swift */; };
BFF5AFD82DE9B8010044227A /* VPWalletHeaderItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFD72DE9B8010044227A /* VPWalletHeaderItemView.swift */; };
F939C04AD4003BA127F15C28 /* Pods_Veloria.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34F57E87E765BF8D72A43DCA /* Pods_Veloria.framework */; };
/* End PBXBuildFile section */
@ -332,6 +340,14 @@
BFF5AFC32DE84F9C0044227A /* Aa厚底黑.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Aa厚底黑.ttf"; sourceTree = "<group>"; };
BFF5AFC52DE863C00044227A /* VPGradientButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPGradientButton.swift; sourceTree = "<group>"; };
BFF5AFC72DE9473B0044227A /* VPCoinsBuyCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPCoinsBuyCell.swift; sourceTree = "<group>"; };
BFF5AFC92DE97B7A0044227A /* VPWalletViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPWalletViewController.swift; sourceTree = "<group>"; };
BFF5AFCB2DE98C7F0044227A /* VPOrderRecordsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPOrderRecordsViewController.swift; sourceTree = "<group>"; };
BFF5AFCD2DE99C730044227A /* VPCoinRecordViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPCoinRecordViewController.swift; sourceTree = "<group>"; };
BFF5AFCF2DE9A0370044227A /* VPCoinRecordCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPCoinRecordCell.swift; sourceTree = "<group>"; };
BFF5AFD12DE9A58A0044227A /* VPVIPRecordViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPVIPRecordViewController.swift; sourceTree = "<group>"; };
BFF5AFD32DE9A5FB0044227A /* VPVIPRecordCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPVIPRecordCell.swift; sourceTree = "<group>"; };
BFF5AFD52DE9A8D70044227A /* VPWalletHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPWalletHeaderView.swift; sourceTree = "<group>"; };
BFF5AFD72DE9B8010044227A /* VPWalletHeaderItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPWalletHeaderItemView.swift; sourceTree = "<group>"; };
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 = "<group>"; };
/* End PBXFileReference section */
@ -968,6 +984,10 @@
BFF5AFAD2DE717BB0044227A /* VPVipPageViewController.swift */,
BFF5AFAF2DE7F9A80044227A /* VPVipViewController.swift */,
BFF5AFB32DE7FF4E0044227A /* VPCoinsViewController.swift */,
BFF5AFC92DE97B7A0044227A /* VPWalletViewController.swift */,
BFF5AFCB2DE98C7F0044227A /* VPOrderRecordsViewController.swift */,
BFF5AFCD2DE99C730044227A /* VPCoinRecordViewController.swift */,
BFF5AFD12DE9A58A0044227A /* VPVIPRecordViewController.swift */,
);
path = Controller;
sourceTree = "<group>";
@ -978,6 +998,10 @@
BFF5AFB52DE803A30044227A /* VPVipPrivilegeItemView.swift */,
BFF5AFB72DE832580044227A /* VPVipBuyCell.swift */,
BFF5AFC72DE9473B0044227A /* VPCoinsBuyCell.swift */,
BFF5AFD52DE9A8D70044227A /* VPWalletHeaderView.swift */,
BFF5AFD72DE9B8010044227A /* VPWalletHeaderItemView.swift */,
BFF5AFCF2DE9A0370044227A /* VPCoinRecordCell.swift */,
BFF5AFD32DE9A5FB0044227A /* VPVIPRecordCell.swift */,
);
path = View;
sourceTree = "<group>";
@ -1156,6 +1180,7 @@
BF0FA73B2DDED1C700C9E5F2 /* VPHomeListCell.swift in Sources */,
BF0FA79F2DE1A29A00C9E5F2 /* VPCollectListCell.swift in Sources */,
BF0FA7592DDF1C2800C9E5F2 /* VPPlayerProgressView.swift in Sources */,
BFF5AFCA2DE97B7A0044227A /* VPWalletViewController.swift in Sources */,
BF0FA71B2DDC7FF200C9E5F2 /* VPImageView.swift in Sources */,
BF0FA7522DDF134700C9E5F2 /* VPVideoPlayerControlView.swift in Sources */,
BF0FA7852DE1561D00C9E5F2 /* VPSearchRecommendedCell.swift in Sources */,
@ -1181,9 +1206,12 @@
BF5E75BE2DE54B2800DE9DFE /* VPAboutUsHeaderView.swift in Sources */,
BFF5AFB22DE7FC130044227A /* CGMutablePath+VPAdd.swift in Sources */,
BF0FA73D2DDED2D000C9E5F2 /* VPVideoAPI.swift in Sources */,
BFF5AFD42DE9A5FB0044227A /* VPVIPRecordCell.swift in Sources */,
BFF5AFD62DE9A8D70044227A /* VPWalletHeaderView.swift in Sources */,
BF0FA6EE2DDC5F8700C9E5F2 /* JXUUID.m in Sources */,
BF5E75B12DE4656600DE9DFE /* VPCampaignWebViewController.swift in Sources */,
BF5E75BC2DE546AD00DE9DFE /* VPAboutUsCell.swift in Sources */,
BFF5AFD02DE9A0370044227A /* VPCoinRecordCell.swift in Sources */,
BF0FA7BA2DE451B900C9E5F2 /* UINavigationBar+VPAdd.swift in Sources */,
BF0FA77D2DE078D400C9E5F2 /* VPSearchRecommendedView.swift in Sources */,
BFF5AFBA2DE837310044227A /* VPWalletAPI.swift in Sources */,
@ -1192,11 +1220,13 @@
BF0FA7052DDC67AC00C9E5F2 /* VPHomeViewModel.swift in Sources */,
BF0FA6EF2DDC5F8700C9E5F2 /* PDKeyChain.m in Sources */,
BF0FA75F2DDFFDB000C9E5F2 /* VPDetailPlayerViewController.swift in Sources */,
BFF5AFCE2DE99C730044227A /* VPCoinRecordViewController.swift in Sources */,
BF0FA7732DE0671200C9E5F2 /* VPRateSelectedCell.swift in Sources */,
1B056E4D2DDAC7C1007EE38D /* VPTabBarController.swift in Sources */,
BF5E75C02DE5566200DE9DFE /* VPHomePageControlView.swift in Sources */,
BFF5AFC22DE837FC0044227A /* VPPayTemplateItem.swift in Sources */,
BF0FA6DA2DDC5CB600C9E5F2 /* VPLoginManager.swift in Sources */,
BFF5AFD82DE9B8010044227A /* VPWalletHeaderItemView.swift in Sources */,
BF0FA74A2DDF04E200C9E5F2 /* VPPlayerProtocol.swift in Sources */,
BFF5AFC82DE9473B0044227A /* VPCoinsBuyCell.swift in Sources */,
BF0FA72C2DDD7B7300C9E5F2 /* VPHomeRankingContentCell.swift in Sources */,
@ -1235,6 +1265,7 @@
BF0FA7892DE161F200C9E5F2 /* VPSearchResultView.swift in Sources */,
1B056E792DDB365A007EE38D /* VPTabBarItemSelectedView.swift in Sources */,
1B056E722DDB022F007EE38D /* VPTabBarItem.swift in Sources */,
BFF5AFCC2DE98C7F0044227A /* VPOrderRecordsViewController.swift in Sources */,
1B056E412DDAC30A007EE38D /* VPModel.swift in Sources */,
BF0FA70A2DDC69C800C9E5F2 /* VPTableViewCell.swift in Sources */,
BF0FA7A12DE1AA5100C9E5F2 /* VPTableView.swift in Sources */,
@ -1248,6 +1279,7 @@
BF0FA7162DDC78FF00C9E5F2 /* ZKCycleScrollViewFlowLayout.swift in Sources */,
BF0FA7172DDC78FF00C9E5F2 /* ZKCycleScrollView.swift in Sources */,
BF0FA7612DDFFE7100C9E5F2 /* VPVideoDetailModel.swift in Sources */,
BFF5AFD22DE9A58A0044227A /* VPVIPRecordViewController.swift in Sources */,
BF5E75B82DE46F7100DE9DFE /* VPNetworkReachabilityManager.swift in Sources */,
BF0FA6D52DDC5B5D00C9E5F2 /* VPApi.swift in Sources */,
BF0FA7C12DE45D5D00C9E5F2 /* VPUserInfo.swift in Sources */,

View File

@ -65,7 +65,7 @@ class VPViewController: UIViewController {
}
extension VPViewController {
extension UIViewController {
func configNavigationBack(_ imageName: String = "arrow_left_icon_01") {
let image = UIImage(named: imageName)

View File

@ -20,11 +20,13 @@ class VPMeToolCell: VPTableViewCell {
private lazy var walletButton: UIButton = {
let button = self.createButton(icon: UIImage(named: "wallet_icon_01"), title: "Wallet".localized)
button.addTarget(self, action: #selector(handleWalletButton), for: .touchUpInside)
return button
}()
private lazy var storeButton: UIButton = {
let button = self.createButton(icon: UIImage(named: "store_icon_01"), title: "Store".localized)
button.addTarget(self, action: #selector(handleStoreButton), for: .touchUpInside)
return button
}()
@ -62,6 +64,20 @@ class VPMeToolCell: VPTableViewCell {
}
extension VPMeToolCell {
@objc private func handleWalletButton() {
let vc = VPWalletViewController()
self.viewController?.navigationController?.pushViewController(vc, animated: true)
}
@objc private func handleStoreButton() {
let vc = VPVipPageViewController()
self.viewController?.navigationController?.pushViewController(vc, animated: true)
}
}
extension VPMeToolCell {
private func vp_setupUI() {

View File

@ -0,0 +1,90 @@
//
// VPCoinRecordViewController.swift
// Veloria
//
// Created by on 2025/5/30.
//
import UIKit
class VPCoinRecordViewController: VPViewController {
private lazy var lineView: UIView = {
let view = UIView()
view.backgroundColor = .colorFFFFFF(alpha: 0.1)
return view
}()
private lazy var tableView: VPTableView = {
let tableView = VPTableView(frame: .zero, style: .plain)
tableView.delegate = self
tableView.dataSource = self
tableView.contentInset = .init(top: 0, left: 0, bottom: UIScreen.tabbarSafeBottomMargin + 10, right: 0)
tableView.showsVerticalScrollIndicator = false
tableView.register(VPCoinRecordCell.self, forCellReuseIdentifier: "cell")
return tableView
}()
override func viewDidLoad() {
super.viewDidLoad()
self.bgImageView.isHidden = true
self.view.backgroundColor = .clear
vp_setupUI()
}
}
extension VPCoinRecordViewController {
private func vp_setupUI() {
view.addSubview(lineView)
view.addSubview(tableView)
lineView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15)
make.top.equalToSuperview()
make.height.equalTo(0.5)
}
tableView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.centerX.equalToSuperview()
make.top.equalToSuperview()
make.bottom.equalToSuperview()
}
}
}
//MARK: -------------- UITableViewDelegate UITableViewDataSource --------------
extension VPCoinRecordViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! VPCoinRecordCell
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 20
}
// func scrollViewDidScroll(_ scrollView: UIScrollView) {
// if scrollView.contentOffset.y < 0 {
// scrollView.contentOffset = .init(x: 0, y: 0)
// }
// }
}
//MARK: -------------- WMZPageProtocol --------------
extension VPCoinRecordViewController: WMZPageProtocol {
func getMyScrollView() -> UIScrollView {
self.tableView
}
}

View File

@ -0,0 +1,105 @@
//
// VPOrderRecordsViewController.swift
// Veloria
//
// Created by on 2025/5/30.
//
import UIKit
class VPOrderRecordsViewController: WMZPageController {
private lazy var viewControllers: [VPViewController] = {
let vc1 = VPCoinRecordViewController()
let vc2 = VPVIPRecordViewController()
return [vc1, vc2]
}()
private lazy var pageParam: WMZPageParam = {
let param = WMZPageParam()
param.wTitleArr = [
"Coin Record".localized,
"VIP Record".localized
]
param.wViewController = { [weak self] index in
return self?.viewControllers[index]
}
param.wTopSuspension = true
param.wMenuTitleWidth = floor((UIScreen.width - 30) / 2)
param.wMenuHeight = 35
param.wMenuTitleUIFont = .fontRegular(ofSize: 14)
param.wMenuTitleSelectUIFont = .fontMedium(ofSize: 15)
param.wMenuTitleColor = .colorFFFFFF(alpha: 0.3)
param.wMenuTitleSelectColor = .colorFFFFFF()
param.wMenuBgColor = .clear
param.wBgColor = .clear
param.wMenuInsets = .init(top: 0, left: 15, bottom: 0, right: 15)
param.wMenuTitleOffset = 0
param.wMenuAnimal = PageTitleMenuLine
param.wMenuIndicatorColor = .colorFFFFFF()
param.wMenuIndicatorRadio = 1
param.wMenuIndicatorHeight = 2
param.wMenuIndicatorTitleRelativeWidth = 0
param.wMenuIndicatorY = 1
param.wScrollCanTransfer = false
param.wCustomNaviBarY = { _ in
return 0
}
param.wCustomTabbarY = { _ in
return 0
}
param.wCustomDataViewTopOffset = 0
return param
}()
private lazy var menuBgView: UIView = {
let view = UIView()
view.backgroundColor = .colorFFFFFF(alpha: 0.1)
view.isUserInteractionEnabled = false
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .clear
self.param = self.pageParam
downSc?.backgroundColor = .clear
self.pageView.backgroundColor = .clear
vp_setupUI()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.view.sendSubviewToBack(menuBgView)
}
}
extension VPOrderRecordsViewController {
private func vp_setupUI() {
// self.pageView.upSc.addSubview(menuBgView)
// self.pageView.upSc.sendSubviewToBack(menuBgView)
self.view.addSubview(menuBgView)
self.view.sendSubviewToBack(menuBgView)
menuBgView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.centerX.equalToSuperview()
make.top.equalToSuperview()
make.height.equalTo(pageParam.wMenuHeight)
}
}
}

View File

@ -0,0 +1,86 @@
//
// VPVIPRecordViewController.swift
// Veloria
//
// Created by on 2025/5/30.
//
import UIKit
class VPVIPRecordViewController: VPViewController {
private lazy var lineView: UIView = {
let view = UIView()
view.backgroundColor = .colorFFFFFF(alpha: 0.1)
return view
}()
private lazy var tableView: VPTableView = {
let tableView = VPTableView(frame: .zero, style: .plain)
tableView.delegate = self
tableView.dataSource = self
tableView.contentInset = .init(top: 0, left: 0, bottom: UIScreen.tabbarSafeBottomMargin + 10, right: 0)
tableView.showsVerticalScrollIndicator = false
tableView.register(VPVIPRecordCell.self, forCellReuseIdentifier: "cell")
return tableView
}()
override func viewDidLoad() {
super.viewDidLoad()
self.bgImageView.isHidden = true
self.view.backgroundColor = .clear
vp_setupUI()
}
}
extension VPVIPRecordViewController {
private func vp_setupUI() {
view.addSubview(lineView)
view.addSubview(tableView)
lineView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15)
make.top.equalToSuperview()
make.height.equalTo(0.5)
}
tableView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.centerX.equalToSuperview()
make.top.equalToSuperview()
make.bottom.equalToSuperview()
}
}
}
//MARK: -------------- UITableViewDelegate UITableViewDataSource --------------
extension VPVIPRecordViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! VPVIPRecordCell
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
// func scrollViewDidScroll(_ scrollView: UIScrollView) {
// if scrollView.contentOffset.y < 0 {
// scrollView.contentOffset = .init(x: 0, y: 0)
// }
// }
}
//MARK: -------------- WMZPageProtocol --------------
extension VPVIPRecordViewController: WMZPageProtocol {
func getMyScrollView() -> UIScrollView {
self.tableView
}
}

View File

@ -0,0 +1,154 @@
//
// VPWalletViewController.swift
// Veloria
//
// Created by on 2025/5/30.
//
import UIKit
class VPWalletViewController: WMZPageController {
private lazy var viewControllers: [UIViewController] = {
let vc1 = VPOrderRecordsViewController()
let vc2 = VPViewController()
let vc3 = VPViewController()
return [vc1, vc2, vc3]
}()
private lazy var pageParam: WMZPageParam = {
let param = WMZPageParam()
param.wTitleArr = [
[
WMZPageBTNKey.keyName : "Order\nRecords".localized,
WMZPageBTNKey.keyImage : UIImage(named: "order_icon_01")!,
WMZPageBTNKey.keySelectImage : UIImage(named: "order_icon_01_selected")!,
WMZPageBTNKey.keyImageOffset : 6
],
[
WMZPageBTNKey.keyName : "Consumption\nRecords".localized,
WMZPageBTNKey.keyImage : UIImage(named: "coin_icon_05")!,
WMZPageBTNKey.keySelectImage : UIImage(named: "coin_icon_05_selected")!,
WMZPageBTNKey.keyImageOffset : 6
],
[
WMZPageBTNKey.keyName : "Reward\nCoins".localized,
WMZPageBTNKey.keyImage : UIImage(named: "coin_icon_06")!,
WMZPageBTNKey.keySelectImage : UIImage(named: "coin_icon_06_selected")!,
WMZPageBTNKey.keyImageOffset : 6
],
]
param.wViewController = { [weak self] index in
return self?.viewControllers[index]
}
param.wTopSuspension = true
//
param.wBounces = true
param.wMenuTitleWidth = floor((UIScreen.width - 30 - 40) / 3)
param.wMenuHeight = 126
param.wMenuTitleUIFont = .fontRegular(ofSize: 12)
param.wMenuTitleSelectUIFont = .fontRegular(ofSize: 12)
param.wMenuTitleColor = .colorFFFFFF(alpha: 0.6)
param.wMenuTitleSelectColor = .colorFFFFFF()
param.wMenuBgColor = .clear
param.wBgColor = .clear
param.wMenuInsets = .init(top: 0, left: 15, bottom: 0, right: 15)
param.wMenuTitleOffset = 20
param.wScrollCanTransfer = false
param.wMenuHeadView = { [weak self] in
return self?.headerView
}
param.wCustomNaviBarY = { _ in
return UIScreen.navBarHeight
}
param.wCustomTabbarY = { _ in
return 0
}
param.wCustomDataViewTopOffset = 0
return param
}()
// private lazy var pageView: WMZPageView = {
// let y = UIScreen.navBarHeight
// let view = WMZPageView(frame: .init(x: 0, y: y, width: UIScreen.width, height: UIScreen.height - y), param: pageParam, parentReponder: self)
//
// view.backgroundColor = .clear
// view.downSc?.backgroundColor = .clear
// view.downSc?.isScrollEnabled = true
//
// return view
// }()
private(set) lazy var bgImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "bg_image_01"))
return imageView
}()
private lazy var menuBgView: UIView = {
let view = UIView()
view.backgroundColor = .colorFFFFFF(alpha: 0.1)
view.addRadius(topLeft: 8, topRight: 8, bottomLeft: 0, bottomRight: 0)
return view
}()
private lazy var headerView: VPWalletHeaderView = {
let view = VPWalletHeaderView(frame: .init(x: 0, y: 0, width: UIScreen.width, height: 175))
view.userInfo = VPLoginManager.manager.userInfo
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
self.title = "My Wallet".localized
self.param = self.pageParam
view.backgroundColor = .clear
downSc?.backgroundColor = .clear
configNavigationBack()
vp_setupUI()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(false, animated: true)
setNavigationNormalStyle()
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
if menuBgView.superview == nil, self.pageView.upSc != nil {
self.pageView.upSc.addSubview(menuBgView)
self.pageView.upSc.sendSubviewToBack(menuBgView)
menuBgView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.centerX.equalToSuperview()
make.top.equalToSuperview()
make.height.equalTo(pageParam.wMenuHeight)
}
}
view.sendSubviewToBack(bgImageView)
}
}
extension VPWalletViewController {
private func vp_setupUI() {
view.addSubview(bgImageView)
view.sendSubviewToBack(bgImageView)
bgImageView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
}
}

View File

@ -0,0 +1,24 @@
//
// VPCoinRecordCell.swift
// Veloria
//
// Created by on 2025/5/30.
//
import UIKit
class VPCoinRecordCell: VPTableViewCell {
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
contentView.backgroundColor = .colorFFFFFF(alpha: 0.1)
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

View File

@ -0,0 +1,22 @@
//
// VPVIPRecordCell.swift
// Veloria
//
// Created by on 2025/5/30.
//
import UIKit
class VPVIPRecordCell: VPTableViewCell {
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
contentView.backgroundColor = .colorFFFFFF(alpha: 0.1)
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

View File

@ -0,0 +1,73 @@
//
// VPWalletHeaderItemView.swift
// Veloria
//
// Created by on 2025/5/30.
//
import UIKit
class VPWalletHeaderItemView: UIView {
var title: String? {
didSet {
titleLabel.text = title
}
}
var count: Int = 0 {
didSet {
coinCountLabel.text = "\(count)"
}
}
private lazy var coinCountLabel: UILabel = {
let label = UILabel()
label.font = .fontBold(ofSize: 18)
label.textColor = .colorFFFFFF()
return label
}()
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.font = .fontRegular(ofSize: 12)
label.textColor = .colorFFFFFF(alpha: 0.8)
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
vp_setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension VPWalletHeaderItemView {
private func vp_setupUI() {
addSubview(coinCountLabel)
addSubview(titleLabel)
titleLabel.snp.makeConstraints { make in
// make.left.equalTo(coinCountLabel)
make.centerX.equalToSuperview()
make.top.equalToSuperview()
}
coinCountLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.bottom.equalToSuperview()
make.top.equalTo(titleLabel.snp.bottom).offset(5)
}
}
}

View File

@ -0,0 +1,147 @@
//
// VPWalletHeaderView.swift
// Veloria
//
// Created by on 2025/5/30.
//
import UIKit
class VPWalletHeaderView: UIView {
var userInfo: VPUserInfo? {
didSet {
avatarImageView.vp_setImage(url: userInfo?.avator, placeholder: UIImage(named: "avatar_placeholder_icon_01"))
coinCountLabel.text = "\(userInfo?.totalCoin ?? 0)"
rechargeCoinView.count = userInfo?.coin_left_total ?? 0
sendCoinView.count = userInfo?.send_coin_left_total ?? 0
// coinCountLabel.text = "1234567890"
}
}
private lazy var bgView: UIView = {
let view = UIView()
view.backgroundColor = .colorFFFFFF(alpha: 0.1)
view.layer.cornerRadius = 8
view.layer.masksToBounds = true
return view
}()
private lazy var avatarImageView: VPImageView = {
let imageView = VPImageView()
imageView.layer.cornerRadius = 34
imageView.layer.masksToBounds = true
imageView.layer.borderWidth = 1
imageView.layer.borderColor = UIColor.colorFFFFFF().cgColor
return imageView
}()
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.font = .fontRegular(ofSize: 12)
label.textColor = .colorFFFFFF(alpha: 0.8)
label.text = "Total Coins".localized
return label
}()
private lazy var coinIconImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "coin_icon_03"))
return imageView
}()
private lazy var coinCountLabel: UILabel = {
let label = UILabel()
label.font = .fontBold(ofSize: 20)
label.textColor = .colorFFFFFF()
return label
}()
private lazy var rechargeCoinView: VPWalletHeaderItemView = {
let view = VPWalletHeaderItemView()
view.title = "Recharge".localized
return view
}()
private lazy var sendCoinView: VPWalletHeaderItemView = {
let view = VPWalletHeaderItemView()
view.title = "Donate".localized
return view
}()
private lazy var lineView: UIView = {
let view = UIView()
view.backgroundColor = .colorFFFFFF(alpha: 0.3)
return view
}()
override init(frame: CGRect) {
super.init(frame: frame)
vp_setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension VPWalletHeaderView {
private func vp_setupUI() {
addSubview(bgView)
addSubview(avatarImageView)
bgView.addSubview(titleLabel)
bgView.addSubview(coinIconImageView)
bgView.addSubview(coinCountLabel)
bgView.addSubview(rechargeCoinView)
bgView.addSubview(sendCoinView)
bgView.addSubview(lineView)
bgView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.centerX.equalToSuperview()
make.bottom.equalToSuperview().offset(-20)
make.height.equalTo(130)
}
avatarImageView.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-35)
make.top.equalToSuperview()
make.width.height.equalTo(68)
}
titleLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(20)
make.top.equalToSuperview().offset(14)
}
coinIconImageView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(20)
make.top.equalToSuperview().offset(37)
}
coinCountLabel.snp.makeConstraints { make in
make.centerY.equalTo(coinIconImageView)
make.left.equalTo(coinIconImageView.snp.right).offset(7)
}
rechargeCoinView.snp.makeConstraints { make in
make.left.equalToSuperview()
make.bottom.equalToSuperview().offset(-13)
}
sendCoinView.snp.makeConstraints { make in
make.left.equalTo(rechargeCoinView.snp.right).offset(1)
make.top.width.equalTo(rechargeCoinView)
make.right.equalToSuperview()
}
lineView.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.centerY.equalTo(rechargeCoinView)
make.width.equalTo(0.5)
make.height.equalTo(27)
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Consumption Records@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Consumption Records@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Consumption Records@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Consumption Records@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Reward Coins@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Reward Coins@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Reward Coins@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Reward Coins@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Order Records@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Order Records@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Order Records.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Order Records@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -55,6 +55,14 @@
"Extra %@" = "Extra %@";
"Get More Coins" = "Get More Coins";
"Coins: %@" = "Coins: %@";
"My Wallet" = "My Wallet";
"Order\nRecords" = "Order\nRecords";
"Consumption\nRecords" = "Consumption\nRecords";
"Reward\nCoins" = "Reward\nCoins";
"Coin Record" = "Coin Record";
"VIP Record" = "VIP Record";
"Total Coins" = "Total Coins";
"Recharge" = "Recharge";
"kHomeTitleText" = "10,000+ addictive shorts await!";