Commit bd4c19aa authored by Alex朱枝文's avatar Alex朱枝文

积分中心

parent e84a6b7b
This diff is collapsed.
...@@ -110,6 +110,11 @@ class YHMyNewViewController: YHBaseViewController { ...@@ -110,6 +110,11 @@ class YHMyNewViewController: YHBaseViewController {
lazy var vipInfoView: YHUserVipInfoView = { lazy var vipInfoView: YHUserVipInfoView = {
let v = YHUserVipInfoView(frame: CGRectMake(0, 0, tableView.width, 113)) let v = YHUserVipInfoView(frame: CGRectMake(0, 0, tableView.width, 113))
v.rightButtonEvent = { [weak self] in
guard let self = self else { return }
let vc = YHMemberCenterViewController()
self.navigationController?.pushViewController(vc)
}
return v return v
}() }()
......
//
// YHMemberCenterCellContent.swift
// galaxy
//
// Created by alexzzw on 2025/2/18.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import Foundation
enum YHMemberCenterCellContent: String, CaseIterable {
case kidsBay = "kidsbay高端早教盒子"
case luxury = "北上港深奢华体验中心"
case crossBorder = "深港跨境出行预约"
case hkTravel = "香港境内出行预约"
case drivingLicense = "国际驾照续期"
case schoolSelection = "香港择校规划"
case brandPlanning = "品牌策划方案"
case highEndMeeting = "高端私董会"
case afternoonTea = "银河体验中心下午茶"
case offlineSalons = "特色线下沙龙&分享会"
case onSiteConsultation = "资深顾问上门咨询解答"
case customerService = "专属客服服务"
case pointsConsumption = "专属积分商城消费"
func imageUrl() -> String {
switch self {
case .kidsBay:
return "member_cell_kidsbay"
case .luxury:
return "member_cell_luxury"
case .crossBorder:
return "member_cell_crossBorder"
case .hkTravel:
return "member_cell_hkTravel"
case .drivingLicense:
return "member_cell_drivingLicense"
case .schoolSelection:
return "member_cell_schoolSelection"
case .brandPlanning:
return "member_cell_brandPlanning"
case .highEndMeeting:
return "member_cell_highEndMeeting"
case .afternoonTea:
return "member_cell_afternoonTea"
case .offlineSalons:
return "member_cell_offlineSalons"
case .onSiteConsultation:
return "member_cell_onSiteConsultation"
case .customerService:
return "member_cell_customerService"
case .pointsConsumption:
return "member_cell_pointsConsumption"
}
}
func imageRatio() -> CGFloat {
switch self {
case .kidsBay:
return 180.0 / 311.0
case .luxury:
return 180.0 / 311.0
case .crossBorder:
return 180.0 / 311.0
case .hkTravel:
return 180.0 / 311.0
case .drivingLicense:
return 126.0 / 311.0
case .schoolSelection:
return 65.0 / 311.0
case .brandPlanning:
return 65.0 / 311.0
case .highEndMeeting:
return 180.0 / 311.0
case .afternoonTea:
return 65.0 / 311.0
case .offlineSalons:
return 126.0 / 311.0
case .onSiteConsultation:
return 180.0 / 311.0
case .customerService:
return 65.0 / 311.0
case .pointsConsumption:
return 108.0 / 311.0
}
}
}
//
// YHMembershipLevel.swift
// galaxy
//
// Created by alexzzw on 2025/2/14.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import Foundation
enum YHMembershipLevel: String, CaseIterable {
case normal = "大众会员"
case gold = "黄金会员"
case platinum = "铂金会员"
case diamond = "钻石会员"
// 可以添加其他属性或方法
var description: String {
return rawValue
}
// 示例:获取会员等级对应的权益
func benefits() -> [String] {
switch self {
case .normal:
return ["基础权益", "普通折扣"]
case .gold:
return ["基础权益", "普通折扣", "专属客服"]
case .platinum:
return ["基础权益", "高级折扣", "专属客服", "优先服务"]
case .diamond:
return ["基础权益", "高级折扣", "专属客服", "优先服务", "VIP活动"]
}
}
func bgIconTitle() -> String {
switch self {
case .normal:
return "member_center_bg_normal"
case .gold:
return "member_center_bg_gold"
case .platinum:
return "member_center_bg_platinum"
case .diamond:
return "member_center_bg_diamond"
}
}
func cardIconTitle() -> String {
switch self {
case .normal:
return "member_center_card_normal"
case .gold:
return "member_center_card_gold"
case .platinum:
return "member_center_card_platinum"
case .diamond:
return "member_center_card_diamond"
}
}
}
//
// YHMemberCenterActionCell.swift
// galaxy
//
// Created by alexzzw on 2025/2/18.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHMemberCenterActionCell: YHResignDocumentCell {
static let cellReuseIdentifier = "YHMemberCenterActionCell"
private let defaultRatio = 180.0 / 311.0
var actionButtonEvent: (() -> Void)?
private lazy var leftLabel: UILabel = {
let label = UILabel()
label.textColor = UIColor.mainTextColor
label.font = .PFSC_M(ofSize: 17)
return label
}()
private lazy var rightLabel: UILabel = {
let label = UILabel()
label.textColor = UIColor(hexString: "#8993A2")
label.font = .PFSC_R(ofSize: 12)
return label
}()
private lazy var contentIcon: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "member_privilege_right")
return view
}()
private lazy var actionButton: YHMemberCenterActionButton = {
let button = YHMemberCenterActionButton(type: .custom)
button.update(state: .redeemable)
return button
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setupUI() {
updateCellCorner(.single)
subContainerView.addSubview(leftLabel)
subContainerView.addSubview(rightLabel)
subContainerView.addSubview(contentIcon)
subContainerView.addSubview(actionButton)
leftLabel.setContentCompressionResistancePriority(.required, for: .horizontal)
rightLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
leftLabel.snp.makeConstraints { make in
make.top.equalToSuperview().offset(20)
make.left.equalToSuperview().offset(16)
}
rightLabel.snp.makeConstraints { make in
make.centerY.equalTo(leftLabel)
make.left.equalTo(leftLabel.snp.right).offset(2)
make.right.lessThanOrEqualToSuperview().offset(-8)
}
contentIcon.snp.makeConstraints { make in
make.top.equalTo(rightLabel.snp.bottom).offset(20)
make.left.equalToSuperview().offset(16)
make.right.equalToSuperview().offset(-16)
make.height.equalTo(contentIcon.snp.width).multipliedBy(defaultRatio)
}
actionButton.snp.makeConstraints { make in
make.top.equalTo(contentIcon.snp.bottom).offset(24)
make.left.equalToSuperview().offset(16)
make.right.equalToSuperview().offset(-16)
make.height.equalTo(42)
make.bottom.equalToSuperview().offset(-16)
}
}
func setupCell(title: String, detail: String, imgStr: String, imageRatio: CGFloat, buttonStr: String, buttonState: YHMemberCenterActionButton.ButtonState) {
leftLabel.text = title
rightLabel.text = detail
contentIcon.image = UIImage(named: imgStr)
contentIcon.snp.remakeConstraints { make in
make.top.equalTo(rightLabel.snp.bottom).offset(20)
make.left.equalToSuperview().offset(16)
make.right.equalToSuperview().offset(-16)
make.height.equalTo(contentIcon.snp.width).multipliedBy(imageRatio)
}
actionButton.setTitle(buttonStr, for: .normal)
actionButton.update(state: buttonState)
}
}
class YHMemberCenterActionButton: UIButton {
enum ButtonState {
case redeemable
case outOfStock
case memberOnly
}
func update(state: ButtonState) {
switch state {
case .redeemable:
backgroundColor = .clear
setTitleColor(.mainTextColor, for: .normal)
titleLabel?.font = .PFSC_M(ofSize: 12)
clipsToBounds = true
layer.cornerRadius = 2.0
layer.borderWidth = 1
layer.borderColor = UIColor(hexString: "#435163")?.cgColor
isEnabled = true
case .outOfStock:
backgroundColor = UIColor(hexString: "#F5F6F8")
setTitleColor(UIColor(hexString: "#B9C1CC"), for: .normal)
titleLabel?.font = .PFSC_M(ofSize: 12)
clipsToBounds = false
layer.cornerRadius = 0
layer.borderWidth = 0
layer.borderColor = nil
isEnabled = false
case .memberOnly:
backgroundColor = UIColor(hexString: "#F5F6F8")
setTitleColor(UIColor(hexString: "#B9C1CC"), for: .normal)
titleLabel?.font = .PFSC_M(ofSize: 12)
clipsToBounds = false
layer.cornerRadius = 0
layer.borderWidth = 0
layer.borderColor = nil
isEnabled = false
}
}
}
//
// YHMemberCenterCurrentPrivilegeCell.swift
// galaxy
//
// Created by alexzzw on 2025/2/17.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHMemberCenterCurrentPrivilegeCell: UITableViewCell {
static let cellReuseIdentifier = "YHMemberCenterCurrentPrivilegeCell"
private lazy var leftLineView: UIView = {
let view = UIView(frame: CGRect(x: 0, y: 0, width: KScreenWidth / 2.0, height: 1))
view.backgroundColor = UIColor(hexString: "#E9ECF0")
return view
}()
private lazy var rightLineView: UIView = {
let view = UIView(frame: CGRect(x: 0, y: 0, width: KScreenWidth / 2.0, height: 1))
view.backgroundColor = UIColor(hexString: "#E9ECF0")
return view
}()
private lazy var leftIcon: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "member_privilege_lock")
return view
}()
private lazy var rightIcon: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "member_privilege_right")
return view
}()
private lazy var midLabel: UILabel = {
let label = UILabel()
label.text = "xx会员拥有特权x项"
label.textColor = UIColor(hexString: "#B9C1CC")
label.font = .PFSC_M(ofSize: 13)
return label
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setupCell(mid: String) {
midLabel.text = mid
}
private func setupUI() {
selectionStyle = .none
backgroundColor = .clear
contentView.addSubview(leftLineView)
contentView.addSubview(rightLineView)
contentView.addSubview(leftIcon)
contentView.addSubview(rightIcon)
contentView.addSubview(midLabel)
midLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
leftIcon.setContentCompressionResistancePriority(.required, for: .horizontal)
rightIcon.setContentCompressionResistancePriority(.required, for: .horizontal)
leftLineView.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
rightLineView.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
midLabel.snp.makeConstraints { make in
make.center.equalToSuperview()
}
leftIcon.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.right.equalTo(midLabel.snp.left).offset(-2)
make.width.height.equalTo(16)
}
rightIcon.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.left.equalTo(midLabel.snp.right).offset(2)
make.width.height.equalTo(16)
}
leftLineView.snp.makeConstraints { make in
make.right.equalTo(leftIcon.snp.left).offset(-8)
make.height.equalTo(1)
make.left.equalToSuperview().offset(25)
}
rightLineView.snp.makeConstraints { make in
make.left.equalTo(rightIcon.snp.left).offset(8)
make.height.equalTo(1)
make.right.equalToSuperview().offset(-25)
}
}
}
//
// YHMemberCenterFooterView.swift
// galaxy
//
// Created by alexzzw on 2025/2/18.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHMemberCenterFooterView: UIView {
private static let iconWidth = 127.0
private static let iconHeight = 48.0
static var viewHeight: CGFloat {
return iconHeight + 42 * 2
}
private lazy var leftLineView: UIView = {
let view = UIView(frame: CGRect(x: 0, y: 0, width: KScreenWidth / 2.0, height: 1))
view.backgroundColor = UIColor(hexString: "#E9ECF0")
return view
}()
private lazy var rightLineView: UIView = {
let view = UIView(frame: CGRect(x: 0, y: 0, width: KScreenWidth / 2.0, height: 1))
view.backgroundColor = UIColor(hexString: "#E9ECF0")
return view
}()
private lazy var contentIcon: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "member_center_brand")
return view
}()
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setupUI() {
addSubview(contentIcon)
addSubview(leftLineView)
addSubview(rightLineView)
contentIcon.snp.makeConstraints { make in
make.center.equalToSuperview()
make.width.equalTo(YHMemberCenterFooterView.iconWidth)
make.height.equalTo(YHMemberCenterFooterView.iconHeight)
}
leftLineView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(24)
make.right.equalTo(contentIcon.snp.left).offset(-12)
make.centerY.equalTo(contentIcon)
make.height.equalTo(1)
}
rightLineView.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-24)
make.left.equalTo(contentIcon.snp.right).offset(12)
make.centerY.equalTo(contentIcon)
make.height.equalTo(1)
}
}
}
//
// YHMemberCenterHeaderBannerCell.swift
// galaxy
//
// Created by alexzzw on 2025/2/14.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import FSPagerView
import UIKit
class YHMemberCenterHeaderBannerCell: FSPagerViewCell {
private lazy var bannerImagV: UIImageView = {
let imagV: UIImageView = UIImageView()
imagV.contentMode = .scaleAspectFit
imagV.clipsToBounds = true
imagV.image = UIImage(named: "global_default_image")
return imagV
}()
private lazy var bannerTitleLabel: UILabel = {
let label = UILabel()
label.font = UIFont.PFSC_B(ofSize: 24)
label.textColor = UIColor.white
return label
}()
private lazy var levelButton: UIButton = {
let button = UIButton(type: .custom)
button.titleLabel?.font = UIFont.PFSC_R(ofSize: 13)
return button
}()
private lazy var upgradeButton: UIButton = {
let button = UIButton(type: .custom)
button.titleLabel?.font = UIFont.PFSC_M(ofSize: 12)
return button
}()
private lazy var countLabel: UILabel = {
let label = UILabel()
label.font = UIFont(name: "DINAlternate-Bold", size: 14)
label.textColor = UIColor.white
return label
}()
private lazy var progressView: UIProgressView = {
let view = UIProgressView()
view.progressTintColor = .white
view.trackTintColor = UIColor.white.withAlphaComponent(0.16)
return view
}()
private lazy var tipsLabel: UILabel = {
let label = UILabel()
label.font = UIFont.PFSC_R(ofSize: 12)
label.textColor = UIColor.white
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
textLabel?.text = ""
textLabel?.isHidden = true
textLabel?.superview?.isHidden = true
imageView?.isHidden = true
initView()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func initView() {
contentView.layer.shadowColor = UIColor.clear.cgColor
contentView.layer.shadowRadius = 0
contentView.layer.shadowOpacity = 0
contentView.layer.shadowOffset = .zero
contentView.addSubview(bannerImagV)
contentView.addSubview(bannerTitleLabel)
contentView.addSubview(levelButton)
contentView.addSubview(countLabel)
contentView.addSubview(tipsLabel)
contentView.addSubview(upgradeButton)
contentView.addSubview(progressView)
bannerImagV.setContentCompressionResistancePriority(.required, for: .vertical)
bannerImagV.setContentCompressionResistancePriority(.required, for: .horizontal)
bannerImagV.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
bannerTitleLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(24)
make.top.equalToSuperview().offset(36)
}
levelButton.snp.makeConstraints { make in
make.left.equalTo(bannerTitleLabel)
make.top.equalTo(bannerTitleLabel.snp.bottom).offset(2)
}
countLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
progressView.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
tipsLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
upgradeButton.setContentCompressionResistancePriority(.required, for: .horizontal)
upgradeButton.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-26)
make.bottom.equalToSuperview().offset(-24)
make.width.equalTo(92)
make.height.equalTo(34)
}
tipsLabel.snp.makeConstraints { make in
make.bottom.equalTo(upgradeButton)
make.left.equalTo(bannerTitleLabel)
make.right.lessThanOrEqualTo(upgradeButton.snp.left).offset(-26)
}
progressView.snp.makeConstraints { make in
make.left.equalTo(bannerTitleLabel)
make.bottom.equalTo(tipsLabel.snp.top).offset(-6)
make.right.equalTo(upgradeButton.snp.left).offset(-26)
make.height.equalTo(2)
}
countLabel.snp.makeConstraints { make in
make.left.equalTo(bannerTitleLabel)
make.bottom.equalTo(progressView.snp.top).offset(-6)
make.right.lessThanOrEqualTo(upgradeButton.snp.left).offset(-26)
}
}
func setupData(level: YHMembershipLevel, levelString: String, countFrom: Int, countTo: Int, tips: String, upgradeTitle: String) {
bannerImagV.image = UIImage(named: level.cardIconTitle())
bannerTitleLabel.text = level.description
bannerTitleLabel.textColor = level.levelTitleColor()
levelButton.setTitleColor(level.levelButtonTitleColor(), for: .normal)
levelButton.setTitle(levelString, for: .normal)
countLabel.textColor = level.countTitleColor()
countLabel.text = countTo == 0 ? "\(countFrom)" : "\(countFrom)/\(countTo)"
progressView.progress = Float(Double(countFrom) * 1.0 / Double(countTo))
tipsLabel.textColor = level.tipsTitleColor()
tipsLabel.text = tips
upgradeButton.setTitle(upgradeTitle, for: .normal)
upgradeButton.setTitleColor(level.upgradeButtonTitleColor(), for: .normal)
upgradeButton.backgroundColor = level.upgradeButtonBackgroundColor()
if level == .normal || level == .diamond {
progressView.isHidden = true
countLabel.snp.remakeConstraints { make in
make.left.equalTo(bannerTitleLabel)
make.bottom.equalTo(tipsLabel.snp.top).offset(-6)
make.right.lessThanOrEqualTo(upgradeButton.snp.left).offset(-26)
}
} else {
progressView.isHidden = false
countLabel.snp.remakeConstraints { make in
make.left.equalTo(bannerTitleLabel)
make.bottom.equalTo(progressView.snp.top).offset(-6)
make.right.lessThanOrEqualTo(upgradeButton.snp.left).offset(-26)
}
}
}
}
fileprivate extension YHMembershipLevel {
func upgradeButtonBackgroundColor() -> UIColor? {
switch self {
case .normal:
return UIColor(hexString: "#323849")
case .gold:
return UIColor(hexString: "#5A2C0E")
case .platinum:
return UIColor(hexString: "#382F6B")
case .diamond:
return UIColor(hexString: "#E0C9AF")
}
}
func upgradeButtonTitleColor() -> UIColor? {
switch self {
case .normal:
return UIColor.white
case .gold:
return UIColor.white
case .platinum:
return UIColor.white
case .diamond:
return UIColor(hexString: "#12296F")
}
}
func levelTitleColor() -> UIColor? {
switch self {
case .normal:
return UIColor.white
case .gold:
return UIColor.white
case .platinum:
return UIColor.white
case .diamond:
return UIColor(hexString: "#EBD7C0")
}
}
func levelButtonTitleColor() -> UIColor? {
switch self {
case .normal:
return UIColor.white.withAlphaComponent(0.5)
case .gold:
return UIColor.white.withAlphaComponent(0.5)
case .platinum:
return UIColor.white.withAlphaComponent(0.5)
case .diamond:
return UIColor(hexString: "#E0C9AF80")?.withAlphaComponent(0.5)
}
}
func countTitleColor() -> UIColor? {
switch self {
case .normal:
return UIColor.white
case .gold:
return UIColor.white
case .platinum:
return UIColor.white
case .diamond:
return UIColor(hexString: "#E0C9AF")
}
}
func tipsTitleColor() -> UIColor? {
switch self {
case .normal:
return UIColor.white.withAlphaComponent(0.7)
case .gold:
return UIColor.white.withAlphaComponent(0.7)
case .platinum:
return UIColor.white.withAlphaComponent(0.7)
case .diamond:
return UIColor(hexString: "#E0C9AF")
}
}
}
//
// YHMemberCenterHeaderView.swift
// galaxy
//
// Created by alexzzw on 2025/2/14.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import FSPagerView
import UIKit
class YHMemberCenterHeaderView: UIView {
class BannerData {
var level: YHMembershipLevel = .normal
var levelString: String = ""
var countFrom: Int = 0
var countTo: Int = 0
var tips: String = ""
var upgradeTitle: String = ""
init(level: YHMembershipLevel, levelString: String, countFrom: Int, countTo: Int, tips: String, upgradeTitle: String) {
self.level = level
self.levelString = levelString
self.countFrom = countFrom
self.countTo = countTo
self.tips = tips
self.upgradeTitle = upgradeTitle
}
}
static private let topMagin: CGFloat = 20
static private let interitemSpacing: CGFloat = 12.0
static var bannerWidth: CGFloat {
let leftWidth: CGFloat = 12.0
return KScreenWidth - interitemSpacing * 2 - leftWidth * 2.0
}
static var bannerHeight: CGFloat {
let ratio: CGFloat = 194.0 / 327.0
return bannerWidth * ratio
}
static var viewHeight: CGFloat {
return bannerHeight + topMagin
}
var scrollToIndexEvent: ((YHMembershipLevel) -> Void)?
private lazy var bannerView: FSPagerView = {
let view = FSPagerView()
view.delegate = self
view.dataSource = self
view.bounces = false
view.isInfinite = false
view.interitemSpacing = YHMemberCenterHeaderView.interitemSpacing
view.register(YHMemberCenterHeaderBannerCell.self, forCellWithReuseIdentifier: "YHMemberCenterHeaderBannerCell")
return view
}()
var datas: [BannerData] {
let normal = BannerData(level: .normal, levelString: "当前等级", countFrom: 0, countTo: 0, tips: "消费即升至黄金会员", upgradeTitle: "去升级")
let gold = BannerData(level: .gold, levelString: "您未达到该等级", countFrom: 1000, countTo: 60000, tips: "距铂金会员还需60000成长值", upgradeTitle: "去升级")
let platinum = BannerData(level: .platinum, levelString: "您未达到该等级", countFrom: 0, countTo: 150000, tips: "距钻石会员还需150000成长值", upgradeTitle: "去升级")
let diamond = BannerData(level: .diamond, levelString: "您未达到该等级", countFrom: 0, countTo: 0, tips: "当前成长值", upgradeTitle: "去升级")
return [normal, gold, platinum, diamond]
}
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setupUI() {
addSubview(bannerView)
bannerView.snp.makeConstraints { make in
make.top.equalToSuperview().offset(YHMemberCenterHeaderView.topMagin)
make.bottom.left.right.equalToSuperview()
}
bannerView.itemSize = CGSizeMake(YHMemberCenterHeaderView.bannerWidth, YHMemberCenterHeaderView.bannerHeight)
}
}
extension YHMemberCenterHeaderView: FSPagerViewDataSource, FSPagerViewDelegate {
public func numberOfItems(in pagerView: FSPagerView) -> Int {
return datas.count
}
public func pagerView(_ pagerView: FSPagerView, cellForItemAt index: Int) -> FSPagerViewCell {
guard datas.count > index else {
return FSPagerViewCell()
}
if let cell = pagerView.dequeueReusableCell(withReuseIdentifier: "YHMemberCenterHeaderBannerCell", at: index) as? YHMemberCenterHeaderBannerCell {
let model = datas[index]
cell.setupData(level: model.level, levelString: model.levelString, countFrom: model.countFrom, countTo: model.countTo, tips: model.tips, upgradeTitle: model.upgradeTitle)
return cell
}
return FSPagerViewCell()
}
func pagerViewWillEndDragging(_ pagerView: FSPagerView, targetIndex: Int) {
guard datas.count > targetIndex else {
return
}
let level = datas[targetIndex].level
scrollToIndexEvent?(level)
}
}
//
// YHMemberCenterMyPrivilegeCell.swift
// galaxy
//
// Created by alexzzw on 2025/2/18.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHMemberCenterMyPrivilegeCell: YHResignDocumentCell {
static let cellReuseIdentifier = "YHMemberCenterMyPrivilegeCell"
private lazy var leftIcon: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "member_coin")
return view
}()
private lazy var midLabel: UILabel = {
let label = UILabel()
label.text = "我的大众会员特权"
label.textColor = UIColor.mainTextColor
label.font = .PFSC_M(ofSize: 16)
return label
}()
private lazy var rightLabel: UILabel = {
let label = UILabel()
label.text = "5项"
label.textColor = UIColor.mainTextColor
label.font = .PFSC_R(ofSize: 14)
return label
}()
private lazy var rightIcon: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "right_arrow_black_20")
return view
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setupCell(right: String) {
rightLabel.text = right
}
private func setupUI() {
updateCellCorner(.single)
subContainerView.addSubview(midLabel)
subContainerView.addSubview(leftIcon)
subContainerView.addSubview(rightLabel)
subContainerView.addSubview(rightIcon)
midLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
leftIcon.setContentCompressionResistancePriority(.required, for: .horizontal)
rightIcon.setContentCompressionResistancePriority(.required, for: .horizontal)
rightLabel.setContentCompressionResistancePriority(.required, for: .horizontal)
leftIcon.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.left.equalToSuperview().offset(16)
make.width.height.equalTo(24)
}
midLabel.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.left.equalTo(leftIcon.snp.right).offset(8)
make.right.lessThanOrEqualTo(rightLabel.snp.left).offset(-8)
}
rightIcon.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.right.equalToSuperview().offset(-16)
make.width.height.equalTo(20)
}
rightLabel.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.right.equalTo(rightIcon.snp.left).offset(-1)
}
}
}
...@@ -98,6 +98,8 @@ class YHUserVipFunctionInfoView: UIView { ...@@ -98,6 +98,8 @@ class YHUserVipFunctionInfoView: UIView {
} }
class YHUserVipInfoView: UIView { class YHUserVipInfoView: UIView {
var rightButtonEvent: (() -> Void)?
var growValue: Int = 0 var growValue: Int = 0
var vipLevel: YHUserVipLevel = .none { var vipLevel: YHUserVipLevel = .none {
...@@ -156,6 +158,7 @@ class YHUserVipInfoView: UIView { ...@@ -156,6 +158,7 @@ class YHUserVipInfoView: UIView {
btn.setTitle("更多权益", for: .normal) btn.setTitle("更多权益", for: .normal)
btn.setTitleColor(.white, for: .normal) btn.setTitleColor(.white, for: .normal)
btn.layer.cornerRadius = 15.0 btn.layer.cornerRadius = 15.0
btn.addTarget(self, action: #selector(rightButtonClicked), for: .touchUpInside)
return btn return btn
}() }()
...@@ -229,6 +232,10 @@ class YHUserVipInfoView: UIView { ...@@ -229,6 +232,10 @@ class YHUserVipInfoView: UIView {
self.update(growValue: 0, vipLevel: .none) self.update(growValue: 0, vipLevel: .none)
} }
@objc func rightButtonClicked() {
rightButtonEvent?()
}
func updateVipLevel(_ vipLevel: YHUserVipLevel) { func updateVipLevel(_ vipLevel: YHUserVipLevel) {
if vipLevel == .gold { if vipLevel == .gold {
......
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_cell_afternoonTea@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_cell_afternoonTea@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_cell_brandPlanning@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_cell_brandPlanning@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_cell_crossBorder@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_cell_crossBorder@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_cell_customerService@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_cell_customerService@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_cell_drivingLicense@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_cell_drivingLicense@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_cell_highEndMeeting@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_cell_highEndMeeting@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_cell_hkTravel@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_cell_hkTravel@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_cell_kidsbay@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_cell_kidsbay@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_cell_luxury@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_cell_luxury@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_cell_offlineSalons@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_cell_offlineSalons@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_cell_onSiteConsultation@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_cell_onSiteConsultation@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_cell_pointsConsumption@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_cell_pointsConsumption@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_cell_schoolSelection@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_cell_schoolSelection@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_center_bg_diamond@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_center_bg_diamond@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_center_bg_gold@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_center_bg_gold@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_center_bg_normal@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_center_bg_normal@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_center_bg_platinum@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_center_bg_platinum@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_center_brand@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_center_brand@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_center_card_diamond@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_center_card_diamond@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_center_card_gold@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_center_card_gold@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_center_card_normal@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_center_card_normal@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_center_card_platinum@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_center_card_platinum@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_coin@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_coin@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_history_list@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_history_list@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_privilege_lock@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_privilege_lock@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "member_privilege_right@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "member_privilege_right@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment