个人主页开发

This commit is contained in:
zjx 2025-05-28 18:13:24 +08:00
parent 0ce6fd93f7
commit 7b0d677a42
63 changed files with 834 additions and 4 deletions

View File

@ -146,6 +146,12 @@
BF5E75D32DE5692D00DE9DFE /* JXBaseAnimatedTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF5E75C12DE5692D00DE9DFE /* JXBaseAnimatedTransition.swift */; };
BF5E75D52DE56B2000DE9DFE /* VPHomeCagetoryRecommandContentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF5E75D42DE56B2000DE9DFE /* VPHomeCagetoryRecommandContentCell.swift */; };
BF5E75DB2DE5B8B700DE9DFE /* VPMarqueeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF5E75DA2DE5B8B700DE9DFE /* VPMarqueeView.swift */; };
BFF5AFA42DE6F15E0044227A /* VPMeVipCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFA32DE6F15E0044227A /* VPMeVipCell.swift */; };
BFF5AFA62DE700420044227A /* VPMeVipPrivilegeItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFA52DE700420044227A /* VPMeVipPrivilegeItemView.swift */; };
BFF5AFA82DE704DC0044227A /* VPMeCoinCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFA72DE704DC0044227A /* VPMeCoinCell.swift */; };
BFF5AFAA2DE7070A0044227A /* VPMeCoinItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFA92DE7070A0044227A /* VPMeCoinItemView.swift */; };
BFF5AFAC2DE70CE20044227A /* VPMeToolCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFAB2DE70CE20044227A /* VPMeToolCell.swift */; };
BFF5AFAE2DE717BB0044227A /* VPVipViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFAD2DE717BB0044227A /* VPVipViewController.swift */; };
F939C04AD4003BA127F15C28 /* Pods_Veloria.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34F57E87E765BF8D72A43DCA /* Pods_Veloria.framework */; };
/* End PBXBuildFile section */
@ -298,6 +304,12 @@
BF5E75C92DE5692D00DE9DFE /* UIViewController+JXTransition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+JXTransition.swift"; sourceTree = "<group>"; };
BF5E75D42DE56B2000DE9DFE /* VPHomeCagetoryRecommandContentCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPHomeCagetoryRecommandContentCell.swift; sourceTree = "<group>"; };
BF5E75DA2DE5B8B700DE9DFE /* VPMarqueeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPMarqueeView.swift; sourceTree = "<group>"; };
BFF5AFA32DE6F15E0044227A /* VPMeVipCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPMeVipCell.swift; sourceTree = "<group>"; };
BFF5AFA52DE700420044227A /* VPMeVipPrivilegeItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPMeVipPrivilegeItemView.swift; sourceTree = "<group>"; };
BFF5AFA72DE704DC0044227A /* VPMeCoinCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPMeCoinCell.swift; sourceTree = "<group>"; };
BFF5AFA92DE7070A0044227A /* VPMeCoinItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPMeCoinItemView.swift; sourceTree = "<group>"; };
BFF5AFAB2DE70CE20044227A /* VPMeToolCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPMeToolCell.swift; sourceTree = "<group>"; };
BFF5AFAD2DE717BB0044227A /* VPVipViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPVipViewController.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 */
@ -836,6 +848,7 @@
BF0FA7AE2DE443E000C9E5F2 /* VPMeViewController.swift */,
BF5E75AE2DE4632200DE9DFE /* VPAboutUsViewController.swift */,
BF5E75B02DE4656600DE9DFE /* VPCampaignWebViewController.swift */,
BFF5AFAD2DE717BB0044227A /* VPVipViewController.swift */,
);
path = Controller;
sourceTree = "<group>";
@ -847,6 +860,11 @@
BF0FA7BB2DE4563300C9E5F2 /* VPMeUserInfoCell.swift */,
BF5E75BB2DE546AD00DE9DFE /* VPAboutUsCell.swift */,
BF5E75BD2DE54B2800DE9DFE /* VPAboutUsHeaderView.swift */,
BFF5AFA32DE6F15E0044227A /* VPMeVipCell.swift */,
BFF5AFA52DE700420044227A /* VPMeVipPrivilegeItemView.swift */,
BFF5AFA72DE704DC0044227A /* VPMeCoinCell.swift */,
BFF5AFA92DE7070A0044227A /* VPMeCoinItemView.swift */,
BFF5AFAB2DE70CE20044227A /* VPMeToolCell.swift */,
);
path = View;
sourceTree = "<group>";
@ -1078,6 +1096,7 @@
BF0FA7832DE1533E00C9E5F2 /* VPGradientLabel.swift in Sources */,
BF0FA7B12DE447EB00C9E5F2 /* VPMeItem.swift in Sources */,
1B056E2C2DDAC0FD007EE38D /* SceneDelegate.swift in Sources */,
BFF5AFA42DE6F15E0044227A /* VPMeVipCell.swift in Sources */,
BF0FA75D2DDF208400C9E5F2 /* VPExplorePlayerControlView.swift in Sources */,
BF5E75CB2DE5692D00DE9DFE /* UINavigationController+JXTransition.swift in Sources */,
BF5E75CC2DE5692D00DE9DFE /* JXTransitionDefine.swift in Sources */,
@ -1085,10 +1104,12 @@
BF5E75CE2DE5692D00DE9DFE /* JXPushAnimatedTransition.swift in Sources */,
BF5E75CF2DE5692D00DE9DFE /* UIViewController+JXTransition.swift in Sources */,
BF5E75D02DE5692D00DE9DFE /* UIGestureRecognizer+JXTransition.swift in Sources */,
BFF5AFA62DE700420044227A /* VPMeVipPrivilegeItemView.swift in Sources */,
BF5E75D12DE5692D00DE9DFE /* JXPopAnimatedTransition.swift in Sources */,
BF5E75D22DE5692D00DE9DFE /* JXNavigationInteractiveTransition.swift in Sources */,
BF5E75D32DE5692D00DE9DFE /* JXBaseAnimatedTransition.swift in Sources */,
1B056E462DDAC370007EE38D /* UIScreen+VPAdd.swift in Sources */,
BFF5AFAA2DE7070A0044227A /* VPMeCoinItemView.swift in Sources */,
BF0FA7692DE0502900C9E5F2 /* VPEpisodeCell.swift in Sources */,
BF5E75BE2DE54B2800DE9DFE /* VPAboutUsHeaderView.swift in Sources */,
BF0FA73D2DDED2D000C9E5F2 /* VPVideoAPI.swift in Sources */,
@ -1119,6 +1140,8 @@
BF0FA7912DE16CBF00C9E5F2 /* VPSearchHistoryView.swift in Sources */,
BF0FA7992DE1951A00C9E5F2 /* VPMyListViewController.swift in Sources */,
BF0FA7452DDF027900C9E5F2 /* VPPlayer.swift in Sources */,
BFF5AFA82DE704DC0044227A /* VPMeCoinCell.swift in Sources */,
BFF5AFAE2DE717BB0044227A /* VPVipViewController.swift in Sources */,
BF0FA70E2DDC6ACC00C9E5F2 /* VPHomeItemContentCell.swift in Sources */,
BF0FA6D72DDC5BE100C9E5F2 /* VPURLPath.swift in Sources */,
1B056E5B2DDACD80007EE38D /* UIColor+VPAdd.swift in Sources */,
@ -1146,6 +1169,7 @@
BF0FA73F2DDEF26E00C9E5F2 /* VPHomeSearchButton.swift in Sources */,
1B056E512DDACBE5007EE38D /* VPViewController.swift in Sources */,
BF0FA7122DDC6D2C00C9E5F2 /* VPHomeModuleItem.swift in Sources */,
BFF5AFAC2DE70CE20044227A /* VPMeToolCell.swift in Sources */,
BF5E75B32DE465EC00DE9DFE /* Dictionary+SPAdd.swift in Sources */,
BF0FA7162DDC78FF00C9E5F2 /* ZKCycleScrollViewFlowLayout.swift in Sources */,
BF0FA7172DDC78FF00C9E5F2 /* ZKCycleScrollView.swift in Sources */,

View File

@ -105,4 +105,16 @@ extension UIColor {
static func colorC4C4C4(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0xC4C4C4, alpha: alpha)
}
static func color06DEAD(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0x06DEAD, alpha: alpha)
}
static func colorE5E5E5(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0xE5E5E5, alpha: alpha)
}
static func colorD3D3D3(alpha: CGFloat = 1) -> UIColor {
return UIColor(rgb: 0xD3D3D3, alpha: alpha)
}
}

View File

@ -15,6 +15,16 @@ class VPMeViewController: VPViewController {
VPMeItem(cellKey: .userInfo),
],
[
VPMeItem(cellKey: .vip)
],
[
VPMeItem(cellKey: .coin)
],
[
VPMeItem(cellKey: .tool)
],
[
VPMeItem(icon: UIImage(named: "me_item_icon_05"), title: "Language".localized, type: .language, cellKey: .normal),
VPMeItem(icon: UIImage(named: "me_item_icon_01"), title: "Privacy Policy".localized, type: .privacyPolicy, cellKey: .normal),
VPMeItem(icon: UIImage(named: "me_item_icon_02"), title: "User Agreement".localized, type: .userAgreement, cellKey: .normal),
// VPMeItem(icon: UIImage(named: "me_item_icon_04"), title: "Help Center".localized, type: .feedback, cellKey: .normal),
@ -31,11 +41,15 @@ class VPMeViewController: VPViewController {
tableView.delegate = self
tableView.dataSource = self
tableView.separatorStyle = .none
tableView.contentInset = .init(top: 0, left: 0, bottom: UIScreen.customTabBarHeight, right: 0)
tableView.vp_addRefreshHeader { [weak self] in
self?.handleHeaderRefresh(nil)
}
tableView.register(VPMeCell.self, forCellReuseIdentifier: VPMeItem.CellKey.normal.rawValue)
tableView.register(VPMeUserInfoCell.self, forCellReuseIdentifier: VPMeItem.CellKey.userInfo.rawValue)
tableView.register(VPMeVipCell.self, forCellReuseIdentifier: VPMeItem.CellKey.vip.rawValue)
tableView.register(VPMeCoinCell.self, forCellReuseIdentifier: VPMeItem.CellKey.coin.rawValue)
tableView.register(VPMeToolCell.self, forCellReuseIdentifier: VPMeItem.CellKey.tool.rawValue)
return tableView
}()
@ -61,7 +75,9 @@ class VPMeViewController: VPViewController {
}
override func handleHeaderRefresh(_ completer: (() -> Void)?) {
self.requestUserInfo()
self.requestUserInfo { [weak self] in
self?.tableView.vp_endHeaderRefreshing()
}
}
}
@ -89,6 +105,8 @@ extension VPMeViewController: UITableViewDelegate, UITableViewDataSource {
cell.item = item
} else if let cell = cell as? VPMeUserInfoCell {
cell.userInfo = VPLoginManager.manager.userInfo
} else if let cell = cell as? VPMeCoinCell {
cell.userInfo = VPLoginManager.manager.userInfo
}
return cell
@ -104,14 +122,14 @@ extension VPMeViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
if section == 0 {
return 0.1
return CGFLOAT_MIN
} else {
return 14
}
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return 0.1
return CGFLOAT_MIN
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
@ -144,9 +162,11 @@ extension VPMeViewController {
///
private func requestUserInfo() {
private func requestUserInfo(completer: (() -> Void)? = nil) {
VPLoginManager.manager.updateUserInfo { [weak self] in
self?.tableView.reloadData()
completer?()
}
}
}

View File

@ -0,0 +1,25 @@
//
// VPVipViewController.swift
// Veloria
//
// Created by on 2025/5/28.
//
import UIKit
class VPVipViewController: VPViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.setNavigationBarHidden(false, animated: true)
setNavigationNormalStyle()
}
}

View File

@ -17,11 +17,15 @@ struct VPMeItem {
case civizatioConvention
case informationSharing
case persoInforDisclosure
case language
}
enum CellKey: String {
case normal
case userInfo
case vip
case coin
case tool
}
var icon: UIImage?

View File

@ -0,0 +1,79 @@
//
// VPMeCoinCell.swift
// Veloria
//
// Created by on 2025/5/28.
//
import UIKit
class VPMeCoinCell: VPTableViewCell {
var userInfo: VPUserInfo? {
didSet {
coinView1.count = userInfo?.coin_left_total ?? 0
coinView2.count = userInfo?.send_coin_left_total ?? 0
}
}
private lazy var lineView: UIView = {
let view = UIView()
view.backgroundColor = .colorFFFFFF(alpha: 0.27)
return view
}()
private lazy var coinView1: VPMeCoinItemView = {
let view = VPMeCoinItemView()
view.title = "Conins".localized
return view
}()
private lazy var coinView2: VPMeCoinItemView = {
let view = VPMeCoinItemView()
view.title = "Donate".localized
return view
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
backgroundColor = .colorFFFFFF(alpha: 0.1)
vp_setupUI()
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension VPMeCoinCell {
private func vp_setupUI() {
addSubview(lineView)
addSubview(coinView1)
addSubview(coinView2)
lineView.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalToSuperview().offset(15)
make.bottom.equalToSuperview().offset(-17)
make.width.equalTo(1)
make.height.equalTo(20)
}
coinView1.snp.makeConstraints { make in
make.centerY.equalTo(lineView)
make.left.equalToSuperview().offset(10)
make.right.equalTo(lineView.snp.left).offset(-10)
}
coinView2.snp.makeConstraints { make in
make.centerY.equalTo(lineView)
make.left.equalTo(lineView.snp.right).offset(10)
make.right.equalToSuperview().offset(-10)
}
}
}

View File

@ -0,0 +1,93 @@
//
// VPMeCoinItemView.swift
// Veloria
//
// Created by on 2025/5/28.
//
import UIKit
class VPMeCoinItemView: UIView {
var title: String? {
didSet {
titleLabel.text = title
}
}
var count: Int = 0 {
didSet {
countLabel.text = "\(count)"
}
}
private lazy var contentView: UIView = {
let view = UIView()
return view
}()
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.font = .fontRegular(ofSize: 14)
label.textColor = .colorD3D3D3()
return label
}()
private lazy var iconImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "coin_icon_01"))
return imageView
}()
private lazy var countLabel: UILabel = {
let label = UILabel()
label.font = .fontBold(ofSize: 15)
label.textColor = .colorFFFFFF()
label.text = "0"
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
vp_setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension VPMeCoinItemView {
private func vp_setupUI() {
addSubview(contentView)
contentView.addSubview(titleLabel)
contentView.addSubview(iconImageView)
contentView.addSubview(countLabel)
contentView.snp.makeConstraints { make in
make.center.equalToSuperview()
}
titleLabel.snp.makeConstraints { make in
make.left.equalToSuperview()
make.centerY.equalToSuperview()
}
iconImageView.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.left.equalTo(titleLabel.snp.right).offset(17)
}
countLabel.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.right.equalToSuperview()
make.left.equalTo(iconImageView.snp.right).offset(4)
}
}
}

View File

@ -0,0 +1,77 @@
//
// VPMeToolCell.swift
// Veloria
//
// Created by on 2025/5/28.
//
import UIKit
class VPMeToolCell: VPTableViewCell {
private lazy var stackView: UIStackView = {
let view = UIStackView(arrangedSubviews: [walletButton, storeButton, rewardsButton, favoritesButton])
view.axis = .horizontal
view.distribution = .fillEqually
view.alignment = .center
return view
}()
private lazy var walletButton: UIButton = {
let button = self.createButton(icon: UIImage(named: "wallet_icon_01"), title: "Wallet".localized)
return button
}()
private lazy var storeButton: UIButton = {
let button = self.createButton(icon: UIImage(named: "store_icon_01"), title: "Store".localized)
return button
}()
private lazy var rewardsButton: UIButton = {
let button = self.createButton(icon: UIImage(named: "rewards_icon_01"), title: "Rewards".localized)
return button
}()
private lazy var favoritesButton: UIButton = {
let button = self.createButton(icon: UIImage(named: "favorites_icon_01"), title: "Favorites".localized)
return button
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
contentView.backgroundColor = .colorFFFFFF(alpha: 0.1)
vp_setupUI()
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func createButton(icon: UIImage?, title: String) -> UIButton {
let button = JXButton(type: .custom)
button.setTitle(title, for: .normal)
button.jx_font = .fontRegular(ofSize: 12)
button.setTitleColor(.colorFFFFFF(), for: .normal)
button.titleDirection = .down
button.setImage(icon, for: .normal)
button.space = 0
return button
}
}
extension VPMeToolCell {
private func vp_setupUI() {
contentView.addSubview(stackView)
stackView.snp.makeConstraints { make in
make.left.right.top.bottom.equalToSuperview()
make.height.equalTo(105)
}
}
}

View File

@ -0,0 +1,173 @@
//
// VPMeVipCell.swift
// Veloria
//
// Created by on 2025/5/28.
//
import UIKit
class VPMeVipCell: VPTableViewCell {
private lazy var bgView: UIView = {
let view = VPGradientView()
view.colors = [UIColor.color06DEAD(alpha: 0.32).cgColor, UIColor.colorFFFFFF(alpha: 0.05).cgColor]
view.locations = [0, 1]
view.startPoint = .init(x: 0, y: 0.5)
view.endPoint = .init(x: 1, y: 0.5)
let tap = UITapGestureRecognizer(target: self, action: #selector(handleBgView))
view.addGestureRecognizer(tap)
return view
}()
private lazy var bgIconImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "vip_icon_01"))
return imageView
}()
private lazy var vipIconImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "vip_icon_02"))
imageView.setContentHuggingPriority(.required, for: .horizontal)
imageView.setContentCompressionResistancePriority(.required, for: .horizontal)
return imageView
}()
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.font = .fontBold(ofSize: 15)
label.textColor = .colorFFFFFF()
label.text = "Join VIP".localized
return label
}()
private lazy var subtitleLabel: UILabel = {
let label = UILabel()
label.font = .fontRegular(ofSize: 12)
label.textColor = .colorFFFFFF()
label.text = "kVipTipText1".localized
return label
}()
private lazy var itemView1: VPMeVipPrivilegeItemView = {
let view = VPMeVipPrivilegeItemView()
view.icon = UIImage(named: "privilege_icon_01")
view.title = "kVipPrivilegeText1".localized
return view
}()
private lazy var itemView2: VPMeVipPrivilegeItemView = {
let view = VPMeVipPrivilegeItemView()
view.icon = UIImage(named: "privilege_icon_02")
view.title = "kVipPrivilegeText2".localized
return view
}()
private lazy var itemView3: VPMeVipPrivilegeItemView = {
let view = VPMeVipPrivilegeItemView()
view.icon = UIImage(named: "privilege_icon_03")
view.title = "kVipPrivilegeText3".localized
return view
}()
private lazy var lineView1: UIView = {
let view = UIView()
view.backgroundColor = .colorFFFFFF(alpha: 0.27)
return view
}()
private lazy var lineView2: UIView = {
let view = UIView()
view.backgroundColor = .colorFFFFFF(alpha: 0.27)
return view
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
vp_setupUI()
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc private func handleBgView() {
let vc = VPVipViewController()
self.viewController?.navigationController?.pushViewController(vc, animated: true)
}
}
extension VPMeVipCell {
private func vp_setupUI() {
contentView.addSubview(bgView)
bgView.addSubview(bgIconImageView)
bgView.addSubview(vipIconImageView)
bgView.addSubview(titleLabel)
bgView.addSubview(subtitleLabel)
bgView.addSubview(itemView1)
bgView.addSubview(itemView2)
bgView.addSubview(itemView3)
bgView.addSubview(lineView1)
bgView.addSubview(lineView2)
bgView.snp.makeConstraints { make in
make.left.right.top.bottom.equalToSuperview()
make.height.equalTo(152)
}
bgIconImageView.snp.makeConstraints { make in
make.top.equalToSuperview().offset(5)
make.right.equalToSuperview()
}
vipIconImageView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(19)
make.top.equalToSuperview().offset(14)
}
titleLabel.snp.makeConstraints { make in
make.left.equalTo(vipIconImageView.snp.right).offset(10)
make.top.equalToSuperview().offset(21)
}
subtitleLabel.snp.makeConstraints { make in
make.left.equalTo(titleLabel)
make.top.equalTo(titleLabel.snp.bottom).offset(2)
make.right.lessThanOrEqualToSuperview().offset(-20)
}
itemView1.snp.makeConstraints { make in
make.left.equalToSuperview()
make.top.equalToSuperview().offset(73)
}
itemView2.snp.makeConstraints { make in
make.left.equalTo(itemView1.snp.right).offset(1)
make.top.equalTo(itemView1)
make.width.equalTo(itemView1)
}
itemView3.snp.makeConstraints { make in
make.left.equalTo(itemView2.snp.right).offset(1)
make.top.equalTo(itemView1)
make.right.equalToSuperview()
make.width.equalTo(itemView1)
}
lineView1.snp.makeConstraints { make in
make.top.equalTo(itemView1).offset(16)
make.left.equalTo(itemView1.snp.right)
make.width.equalTo(1)
make.height.equalTo(42)
}
lineView2.snp.makeConstraints { make in
make.top.width.height.equalTo(lineView1)
make.left.equalTo(itemView2.snp.right)
}
}
}

View File

@ -0,0 +1,69 @@
//
// VPMeVipPrivilegeItemView.swift
// Veloria
//
// Created by on 2025/5/28.
//
import UIKit
class VPMeVipPrivilegeItemView: UIView {
var icon: UIImage? {
didSet {
iconImageView.image = icon
}
}
var title: String? {
didSet {
titleLabel.text = title
}
}
private lazy var iconImageView: UIImageView = {
let imageView = UIImageView()
return imageView
}()
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.numberOfLines = 0
label.font = .fontRegular(ofSize: 12)
label.textColor = .colorE5E5E5()
label.textAlignment = .center
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
vp_setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension VPMeVipPrivilegeItemView {
private func vp_setupUI() {
addSubview(iconImageView)
addSubview(titleLabel)
iconImageView.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalToSuperview()
}
titleLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalTo(iconImageView.snp.bottom)
make.bottom.equalToSuperview()
}
}
}

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 965 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "组 343@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "组 343@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: 8.4 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

@ -34,12 +34,24 @@
"Feedback" = "Feedback";
"Feedback Details" = "Feedback Details";
"Rewards" = "Rewards";
"Join VIP" = "Join VIP";
"Conins" = "Conins";
"Donate" = "Donate";
"Wallet" = "Wallet";
"Store" = "Store";
"Rewards" = "Rewards";
"Favorites" = "Favorites";
"Language" = "Language";
"kHomeTitleText" = "10,000+ addictive shorts await!";
"kSearchPlaceholderText1" = "Search dramas";
"kSearchPlaceholderText2" = "#Recersal of fate";
"kHomeMenuTitle" = "Select Categories";
"kVipTipText1" = "unlock 1000+ exclusive dramas";
"kVipPrivilegeText1" = "Ad-Free\nStreaming";
"kVipPrivilegeText2" = "Exclusive\nEpisodes";
"kVipPrivilegeText3" = "Daily free\ncoins";
//请选择需要删除的短剧
"kToastText1" = "Please select the short plays that need to be deleted";

BIN
资料/授权文件.zip Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

View File

Before

Width:  |  Height:  |  Size: 6.8 MiB

After

Width:  |  Height:  |  Size: 6.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB