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

积分中心

parent e84a6b7b
......@@ -68,6 +68,10 @@
04307BB42D21623300ED8E8D /* YHRecommendedAppointmentLiveView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04307BB32D21623300ED8E8D /* YHRecommendedAppointmentLiveView.swift */; };
04307BB62D2180C300ED8E8D /* YHRecommendedOnLiveView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04307BB52D2180C300ED8E8D /* YHRecommendedOnLiveView.swift */; };
04307BBC2D22A21E00ED8E8D /* YHLiveStatusModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04307BBB2D22A21E00ED8E8D /* YHLiveStatusModel.swift */; };
0436713B2D643A7A00E8D9BA /* YHMemberCenterMyPrivilegeCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0436713A2D643A7A00E8D9BA /* YHMemberCenterMyPrivilegeCell.swift */; };
0436713D2D6470A400E8D9BA /* YHMemberCenterActionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0436713C2D6470A400E8D9BA /* YHMemberCenterActionCell.swift */; };
0436713F2D64817500E8D9BA /* YHMemberCenterFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0436713E2D64817500E8D9BA /* YHMemberCenterFooterView.swift */; };
043671412D64935200E8D9BA /* YHMemberCenterCellContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 043671402D64935200E8D9BA /* YHMemberCenterCellContent.swift */; };
045C0F7F2D12CA5F00BD2DC0 /* submit_page_scroll.gif in Resources */ = {isa = PBXBuildFile; fileRef = 045C0F4F2D12CA5E00BD2DC0 /* submit_page_scroll.gif */; };
045C0F802D12CA5F00BD2DC0 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 045C0F762D12CA5E00BD2DC0 /* Localizable.xcstrings */; };
045C0F812D12CA5F00BD2DC0 /* img_0.png in Resources */ = {isa = PBXBuildFile; fileRef = 045C0F5E2D12CA5E00BD2DC0 /* img_0.png */; };
......@@ -1153,6 +1157,11 @@
047A968F2D16AA410033BB4E /* YHGCIncomeRecordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 047A968A2D16AA410033BB4E /* YHGCIncomeRecordViewController.swift */; };
047A96902D16AA410033BB4E /* YHGCIncomeRecordWorkExperienceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 047A968B2D16AA410033BB4E /* YHGCIncomeRecordWorkExperienceViewController.swift */; };
047A96932D16C0900033BB4E /* YHInfoQuestionSelectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 047A96922D16C0900033BB4E /* YHInfoQuestionSelectionCell.swift */; };
048D6ADB2D5E00DE00BC6F4C /* YHMemberCenterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 048D6ADA2D5E00DE00BC6F4C /* YHMemberCenterViewController.swift */; };
048D6ADD2D5EF0A900BC6F4C /* YHMemberCenterHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 048D6ADC2D5EF0A900BC6F4C /* YHMemberCenterHeaderView.swift */; };
048D6ADF2D5F0FBE00BC6F4C /* YHMemberCenterHeaderBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 048D6ADE2D5F0FBE00BC6F4C /* YHMemberCenterHeaderBannerCell.swift */; };
048D6AE12D5F17C400BC6F4C /* YHMembershipLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 048D6AE02D5F17C400BC6F4C /* YHMembershipLevel.swift */; };
048D6AE32D6348F000BC6F4C /* YHMemberCenterCurrentPrivilegeCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 048D6AE22D6348EF00BC6F4C /* YHMemberCenterCurrentPrivilegeCell.swift */; };
04AE200F2D12CFAF00891D24 /* YHGCMineSchemeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04AE1FF82D12CFAF00891D24 /* YHGCMineSchemeViewController.swift */; };
04AE20102D12CFAF00891D24 /* YHGCApplicationTypeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04AE1FFD2D12CFAF00891D24 /* YHGCApplicationTypeController.swift */; };
04AE20112D12CFAF00891D24 /* YHGCApplicationTypeResultController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04AE1FFE2D12CFAF00891D24 /* YHGCApplicationTypeResultController.swift */; };
......@@ -1297,6 +1306,10 @@
04307BB32D21623300ED8E8D /* YHRecommendedAppointmentLiveView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHRecommendedAppointmentLiveView.swift; sourceTree = "<group>"; };
04307BB52D2180C300ED8E8D /* YHRecommendedOnLiveView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHRecommendedOnLiveView.swift; sourceTree = "<group>"; };
04307BBB2D22A21E00ED8E8D /* YHLiveStatusModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHLiveStatusModel.swift; sourceTree = "<group>"; };
0436713A2D643A7A00E8D9BA /* YHMemberCenterMyPrivilegeCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterMyPrivilegeCell.swift; sourceTree = "<group>"; };
0436713C2D6470A400E8D9BA /* YHMemberCenterActionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterActionCell.swift; sourceTree = "<group>"; };
0436713E2D64817500E8D9BA /* YHMemberCenterFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterFooterView.swift; sourceTree = "<group>"; };
043671402D64935200E8D9BA /* YHMemberCenterCellContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterCellContent.swift; sourceTree = "<group>"; };
045C0A142D12CA5E00BD2DC0 /* YHBaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHBaseViewController.swift; sourceTree = "<group>"; };
045C0A152D12CA5E00BD2DC0 /* YHBaseViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHBaseViewModel.swift; sourceTree = "<group>"; };
045C0A162D12CA5E00BD2DC0 /* YHNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHNavigationController.swift; sourceTree = "<group>"; };
......@@ -2387,6 +2400,11 @@
047A968A2D16AA410033BB4E /* YHGCIncomeRecordViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHGCIncomeRecordViewController.swift; sourceTree = "<group>"; };
047A968B2D16AA410033BB4E /* YHGCIncomeRecordWorkExperienceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHGCIncomeRecordWorkExperienceViewController.swift; sourceTree = "<group>"; };
047A96922D16C0900033BB4E /* YHInfoQuestionSelectionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHInfoQuestionSelectionCell.swift; sourceTree = "<group>"; };
048D6ADA2D5E00DE00BC6F4C /* YHMemberCenterViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterViewController.swift; sourceTree = "<group>"; };
048D6ADC2D5EF0A900BC6F4C /* YHMemberCenterHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterHeaderView.swift; sourceTree = "<group>"; };
048D6ADE2D5F0FBE00BC6F4C /* YHMemberCenterHeaderBannerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterHeaderBannerCell.swift; sourceTree = "<group>"; };
048D6AE02D5F17C400BC6F4C /* YHMembershipLevel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMembershipLevel.swift; sourceTree = "<group>"; };
048D6AE22D6348EF00BC6F4C /* YHMemberCenterCurrentPrivilegeCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterCurrentPrivilegeCell.swift; sourceTree = "<group>"; };
04AE1FF82D12CFAF00891D24 /* YHGCMineSchemeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHGCMineSchemeViewController.swift; sourceTree = "<group>"; };
04AE1FFA2D12CFAF00891D24 /* YHGCSchemeTableHeadView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHGCSchemeTableHeadView.swift; sourceTree = "<group>"; };
04AE1FFD2D12CFAF00891D24 /* YHGCApplicationTypeController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHGCApplicationTypeController.swift; sourceTree = "<group>"; };
......@@ -5707,6 +5725,7 @@
04AFEF3E2D5D8F8A0007A011 /* YHMyNewViewController.swift */,
045C0EDF2D12CA5E00BD2DC0 /* YHTestViewController.swift */,
045C0EE02D12CA5E00BD2DC0 /* YHVideoPlaySettingVC.swift */,
048D6ADA2D5E00DE00BC6F4C /* YHMemberCenterViewController.swift */,
);
path = C;
sourceTree = "<group>";
......@@ -5715,6 +5734,8 @@
isa = PBXGroup;
children = (
045C0EE22D12CA5E00BD2DC0 /* YHCollectionModel.swift */,
048D6AE02D5F17C400BC6F4C /* YHMembershipLevel.swift */,
043671402D64935200E8D9BA /* YHMemberCenterCellContent.swift */,
);
path = Model;
sourceTree = "<group>";
......@@ -5784,6 +5805,12 @@
045C0EF92D12CA5E00BD2DC0 /* YHUserInfoHeaderView.swift */,
04AFEF4A2D5DF3710007A011 /* YHMyUserInfoView.swift */,
04AFEF4C2D5EEF860007A011 /* YHUserVipInfoView.swift */,
048D6ADC2D5EF0A900BC6F4C /* YHMemberCenterHeaderView.swift */,
048D6ADE2D5F0FBE00BC6F4C /* YHMemberCenterHeaderBannerCell.swift */,
048D6AE22D6348EF00BC6F4C /* YHMemberCenterCurrentPrivilegeCell.swift */,
0436713A2D643A7A00E8D9BA /* YHMemberCenterMyPrivilegeCell.swift */,
0436713C2D6470A400E8D9BA /* YHMemberCenterActionCell.swift */,
0436713E2D64817500E8D9BA /* YHMemberCenterFooterView.swift */,
);
path = V;
sourceTree = "<group>";
......@@ -6861,6 +6888,7 @@
045C0FCE2D12CA5F00BD2DC0 /* YHAIServiceListViewController.swift in Sources */,
045C0FCF2D12CA5F00BD2DC0 /* YHResignCertificateListViewController.swift in Sources */,
045C0FD02D12CA5F00BD2DC0 /* YHIHKIdentityPlanCell.swift in Sources */,
043671412D64935200E8D9BA /* YHMemberCenterCellContent.swift in Sources */,
045C0FD12D12CA5F00BD2DC0 /* YHOtherInfoSessionView.swift in Sources */,
045C0FD22D12CA5F00BD2DC0 /* YHMineSchemeViewController.swift in Sources */,
045C0FD32D12CA5F00BD2DC0 /* YHFamilyRequestViewModel.swift in Sources */,
......@@ -6898,6 +6926,7 @@
045C0FEF2D12CA5F00BD2DC0 /* YHUatHelper.swift in Sources */,
045C0FF02D12CA5F00BD2DC0 /* YHPlayerTopBarView.swift in Sources */,
045C0FF12D12CA5F00BD2DC0 /* YHDatePickView.swift in Sources */,
0436713B2D643A7A00E8D9BA /* YHMemberCenterMyPrivilegeCell.swift in Sources */,
045C0FF22D12CA5F00BD2DC0 /* YHAdopterTravelViewController.swift in Sources */,
045C0FF32D12CA5F00BD2DC0 /* YHSearchInfoCell.swift in Sources */,
045C0FF42D12CA5F00BD2DC0 /* YHWorkExperienceViewModel.swift in Sources */,
......@@ -7053,6 +7082,7 @@
045C10812D12CA5F00BD2DC0 /* YHServiceOrderListViewController.swift in Sources */,
04AE200F2D12CFAF00891D24 /* YHGCMineSchemeViewController.swift in Sources */,
04AE20102D12CFAF00891D24 /* YHGCApplicationTypeController.swift in Sources */,
048D6ADD2D5EF0A900BC6F4C /* YHMemberCenterHeaderView.swift in Sources */,
04AE20112D12CFAF00891D24 /* YHGCApplicationTypeResultController.swift in Sources */,
04AE20122D12CFAF00891D24 /* YHGCApplicationTypeViewModel.swift in Sources */,
04AE20132D12CFAF00891D24 /* YHGCVisaProgramPopVC.swift in Sources */,
......@@ -7208,6 +7238,7 @@
045C11092D12CA5F00BD2DC0 /* YHResignCertificateListViewModel.swift in Sources */,
045C110A2D12CA5F00BD2DC0 /* YHResignDocumentListModel.swift in Sources */,
04307BB62D2180C300ED8E8D /* YHRecommendedOnLiveView.swift in Sources */,
0436713F2D64817500E8D9BA /* YHMemberCenterFooterView.swift in Sources */,
045C110B2D12CA5F00BD2DC0 /* YHInformationPerfectCell.swift in Sources */,
045C110C2D12CA5F00BD2DC0 /* YHOrderTipsItemView.swift in Sources */,
045C110D2D12CA5F00BD2DC0 /* YHConfigModel.swift in Sources */,
......@@ -7223,6 +7254,7 @@
045C11172D12CA5F00BD2DC0 /* YHFileListViewController.swift in Sources */,
045C11182D12CA5F00BD2DC0 /* YHSchemeTableViewCell.swift in Sources */,
045C11192D12CA5F00BD2DC0 /* YHLookResignResultViewModel.swift in Sources */,
048D6AE12D5F17C400BC6F4C /* YHMembershipLevel.swift in Sources */,
045C111A2D12CA5F00BD2DC0 /* YHActivityDetailCell.swift in Sources */,
045C111B2D12CA5F00BD2DC0 /* YHSegmentView.swift in Sources */,
045C111C2D12CA5F00BD2DC0 /* YHCertificateFilterView.swift in Sources */,
......@@ -7296,9 +7328,11 @@
04AE203B2D13C01B00891D24 /* YHGCEducationInfoListVC.swift in Sources */,
045C11562D12CA5F00BD2DC0 /* YHHUDSquareBaseView.swift in Sources */,
045C11572D12CA5F00BD2DC0 /* YHCountryHotView.swift in Sources */,
048D6ADB2D5E00DE00BC6F4C /* YHMemberCenterViewController.swift in Sources */,
045C11582D12CA5F00BD2DC0 /* YHPreviewBaseViewController.swift in Sources */,
045C11592D12CA5F00BD2DC0 /* YHAITextMessageCell.swift in Sources */,
04307BB02D215D1C00ED8E8D /* YHRecommendedLiveHeader.swift in Sources */,
048D6ADF2D5F0FBE00BC6F4C /* YHMemberCenterHeaderBannerCell.swift in Sources */,
045C115A2D12CA5F00BD2DC0 /* YHScemeItemModel.swift in Sources */,
045C115B2D12CA5F00BD2DC0 /* YHHKRecordItemDetailType.swift in Sources */,
045C115C2D12CA5F00BD2DC0 /* YHHUDContainerView.swift in Sources */,
......@@ -7728,6 +7762,7 @@
04AE20272D13B1B600891D24 /* YHGCSpousePrimaryInfoVC.swift in Sources */,
045C12DF2D12CA5F00BD2DC0 /* YHVisaRenewalPayStatusCell.swift in Sources */,
045C12E02D12CA5F00BD2DC0 /* YHCollegeNameCell.swift in Sources */,
048D6AE32D6348F000BC6F4C /* YHMemberCenterCurrentPrivilegeCell.swift in Sources */,
045C12E12D12CA5F00BD2DC0 /* YHPreviewInfoIncomeTypeCell.swift in Sources */,
04AE20652D1BD9B500891D24 /* YHGCCertificateEntryCell.swift in Sources */,
045C12E22D12CA5F00BD2DC0 /* YHUploadCertificateVC.swift in Sources */,
......@@ -7949,6 +7984,7 @@
04AE20292D13B20900891D24 /* YHGCSpouseInfoContainerVC.swift in Sources */,
045C13A92D12CA5F00BD2DC0 /* YHAllowUseMyInfoViewController.swift in Sources */,
045C13AA2D12CA5F00BD2DC0 /* YHServiceCenterProgressModel.swift in Sources */,
0436713D2D6470A400E8D9BA /* YHMemberCenterActionCell.swift in Sources */,
045C13AB2D12CA5F00BD2DC0 /* Dictionary+Extension.swift in Sources */,
045C13AC2D12CA5F00BD2DC0 /* YHHomePageViewController.swift in Sources */,
045C13AD2D12CA5F00BD2DC0 /* YHIncomeRecordFromCell.swift in Sources */,
......
//
// YHMemberCenterViewController.swift
// galaxy
//
// Created by alexzzw on 2025/2/13.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHMemberCenterViewController: YHBaseViewController {
enum TableRow {
case currentPrivilege(_ curLevel: YHMembershipLevel, _ count: Int)
case myPrivilege(_ myLevel: YHMembershipLevel, _ count: Int)
case action(_ title: String, _ detail: String, _ imageStr: String, _ ratio: CGFloat, _ buttonStr: String, _ buttonState: YHMemberCenterActionButton.ButtonState)
}
private var currentLevel: YHMembershipLevel = .normal
var datas: [TableRow] = []
private lazy var tableView: UITableView = {
let view = UITableView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: KScreenHeight), style: .grouped)
view.estimatedSectionHeaderHeight = 0.01
view.estimatedSectionFooterHeight = 16
view.contentInsetAdjustmentBehavior = .never
view.backgroundColor = .clear
view.separatorStyle = .none
view.dataSource = self
view.delegate = self
view.showsVerticalScrollIndicator = false
view.register(YHMemberCenterCurrentPrivilegeCell.self, forCellReuseIdentifier: YHMemberCenterCurrentPrivilegeCell.cellReuseIdentifier)
view.register(YHMemberCenterMyPrivilegeCell.self, forCellReuseIdentifier: YHMemberCenterMyPrivilegeCell.cellReuseIdentifier)
view.register(YHMemberCenterActionCell.self, forCellReuseIdentifier: YHMemberCenterActionCell.cellReuseIdentifier)
return view
}()
private lazy var bgIcon: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "member_center_bg_normal")
return view
}()
private lazy var headerView: YHMemberCenterHeaderView = {
let view = YHMemberCenterHeaderView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: YHMemberCenterHeaderView.viewHeight))
view.scrollToIndexEvent = { [weak self] level in
guard let self = self else {
return
}
self.bgIcon.image = UIImage(named: level.bgIconTitle())
self.currentLevel = level
self.setupDatas()
}
return view
}()
private lazy var footerView: YHMemberCenterFooterView = {
let view = YHMemberCenterFooterView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: YHMemberCenterFooterView.viewHeight))
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
setupDatas()
}
private func setupUI() {
gk_navBarAlpha = 0
gk_navigationBar.backgroundColor = .clear
view.backgroundColor = UIColor.contentBkgColor
view.addSubview(bgIcon)
view.addSubview(tableView)
let historyItem = UIBarButtonItem.gk_item(image: UIImage(named: "member_history_list"), target: self, action: #selector(didHistoryButtonClicked))
let shareItem = UIBarButtonItem.gk_item(image: UIImage(named: "share_item"), target: self, action: #selector(didShareButtonClicked))
gk_navigationItem.rightBarButtonItems = [shareItem, historyItem]
let ratio = 375.0 / 375.0
bgIcon.snp.makeConstraints { make in
make.top.left.right.equalToSuperview()
make.height.equalTo(bgIcon.snp.width).multipliedBy(ratio)
}
tableView.snp.makeConstraints { make in
make.left.equalToSuperview()
make.right.equalToSuperview()
make.top.equalTo(k_Height_NavigationtBarAndStatuBar)
make.bottom.equalTo(view.safeAreaLayoutGuide.snp.bottom)
}
tableView.tableHeaderView = headerView
tableView.tableFooterView = footerView
}
private func setupDatas() {
datas.removeAll()
switch currentLevel {
case .normal:
datas.append(.myPrivilege(.normal, 5))
let services: [YHMemberCenterCellContent] = [.customerService, .pointsConsumption, .afternoonTea, .offlineSalons, .onSiteConsultation]
let details: [String] = ["不限次数兑换", "不限次数兑换", "不限次数兑换", "不限次数兑换", "不限次数兑换"]
let buttonTitles: [String] = ["立即联系", "了解更多", "立即兑换", "了解更多", "了解更多"]
let buttonStates: [YHMemberCenterActionButton.ButtonState] = [.redeemable, .redeemable, .redeemable, .redeemable, .redeemable]
services.enumerated().forEach { index, service in
let row: TableRow = .action(service.rawValue, details[index], service.imageUrl(), service.imageRatio(), buttonTitles[index], buttonStates[index])
datas.append(row)
}
case .gold:
datas.append(.currentPrivilege(.gold, 7))
datas.append(.myPrivilege(.normal, 5))
let services: [YHMemberCenterCellContent] = [.kidsBay, .luxury, .afternoonTea, .offlineSalons, .onSiteConsultation, .customerService, .pointsConsumption]
let details: [String] = ["本月剩余兑换数量:20", "本月剩余兑换数量:20", "不限次数兑换", "不限次数兑换", "不限次数兑换", "不限次数兑换", "不限次数兑换", "不限次数兑换"]
let buttonTitles: [String] = ["了解更多", "了解更多", "立即兑换", "了解更多", "了解更多", "立即联系", "了解更多"]
let buttonStates: [YHMemberCenterActionButton.ButtonState] = [.redeemable, .redeemable, .redeemable, .redeemable, .redeemable, .redeemable, .redeemable]
services.enumerated().forEach { index, service in
let row: TableRow = .action(service.rawValue, details[index], service.imageUrl(), service.imageRatio(), buttonTitles[index], buttonStates[index])
datas.append(row)
}
case .platinum:
datas.append(.currentPrivilege(.platinum, 8))
datas.append(.myPrivilege(.normal, 5))
let services: [YHMemberCenterCellContent] = [.kidsBay, .luxury, .hkTravel, .afternoonTea, .offlineSalons, .onSiteConsultation, .customerService, .pointsConsumption]
let details: [String] = ["本月剩余兑换数量:20", "本月剩余兑换数量:20", "本月剩余兑换数量:20", "不限次数兑换", "不限次数兑换", "不限次数兑换", "不限次数兑换", "不限次数兑换"]
let buttonTitles: [String] = ["了解更多", "了解更多", "了解更多", "立即兑换", "了解更多", "了解更多", "立即联系", "了解更多"]
let buttonStates: [YHMemberCenterActionButton.ButtonState] = [.redeemable, .redeemable, .redeemable, .redeemable, .redeemable, .redeemable, .redeemable, .redeemable]
services.enumerated().forEach { index, service in
let row: TableRow = .action(service.rawValue, details[index], service.imageUrl(), service.imageRatio(), buttonTitles[index], buttonStates[index])
datas.append(row)
}
case .diamond:
datas.append(.currentPrivilege(.diamond, 13))
datas.append(.myPrivilege(.normal, 5))
let services: [YHMemberCenterCellContent] = [.kidsBay, .luxury, .crossBorder, .hkTravel, .drivingLicense, .schoolSelection, .brandPlanning, .highEndMeeting, .afternoonTea, .offlineSalons, .onSiteConsultation, .customerService, .pointsConsumption]
let details: [String] = ["本月剩余兑换数量:20", "本月剩余兑换数量:20", "本月已兑换完毕,次月更新", "本月剩余兑换数量:20", "本月剩余兑换数量:20", "本月剩余兑换数量:20", "本月剩余兑换数量:20", "本月剩余兑换数量:20", "不限次数兑换", "不限次数兑换", "不限次数兑换", "不限次数兑换", "不限次数兑换"]
let buttonTitles: [String] = ["了解更多", "了解更多", "暂无库存", "了解更多", "了解更多", "了解更多", "了解更多", "了解更多", "立即兑换", "了解更多", "了解更多", "立即联系", "了解更多"]
let buttonStates: [YHMemberCenterActionButton.ButtonState] = [.redeemable, .redeemable, .outOfStock, .redeemable, .redeemable, .redeemable, .redeemable, .redeemable, .redeemable, .redeemable, .redeemable, .redeemable, .redeemable]
services.enumerated().forEach { index, service in
let row: TableRow = .action(service.rawValue, details[index], service.imageUrl(), service.imageRatio(), buttonTitles[index], buttonStates[index])
datas.append(row)
}
}
tableView.reloadData()
}
@objc private func didHistoryButtonClicked() {
//
}
@objc private func didShareButtonClicked() {
//
}
}
extension YHMemberCenterViewController: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return datas.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if datas.count > section {
return 1
}
return 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard datas.count > indexPath.section else {
return UITableViewCell()
}
let section = datas[indexPath.section]
switch section {
case let .currentPrivilege(level, count):
if let cell = tableView.dequeueReusableCell(withIdentifier: YHMemberCenterCurrentPrivilegeCell.cellReuseIdentifier) as? YHMemberCenterCurrentPrivilegeCell {
cell.setupCell(mid: "\(level.description)拥有特权\(count)项")
return cell
}
case let .myPrivilege(_, count):
if let cell = tableView.dequeueReusableCell(withIdentifier: YHMemberCenterMyPrivilegeCell.cellReuseIdentifier) as? YHMemberCenterMyPrivilegeCell {
cell.setupCell(right: "\(count)项")
return cell
}
case let .action(title, detail, imageStr, ratio, buttonStr, buttonState):
if let cell = tableView.dequeueReusableCell(withIdentifier: YHMemberCenterActionCell.cellReuseIdentifier) as? YHMemberCenterActionCell {
cell.setupCell(title: title, detail: detail, imgStr: imageStr, imageRatio: ratio, buttonStr: buttonStr, buttonState: buttonState)
return cell
}
}
return UITableViewCell()
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
guard datas.count > indexPath.section else {
return 0
}
let section = datas[indexPath.section]
switch section {
case .currentPrivilege:
return 74.0
case .myPrivilege:
return 64
case .action:
return UITableView.automaticDimension
}
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
guard datas.count > section else {
return 0.01
}
if section == 0 {
if case .myPrivilege = datas[0] {
return 32
} else {
return 0.01
}
}
return 0.01
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
guard datas.count > section else {
return 0.01
}
if section == 0 {
if case .myPrivilege = datas[0] {
return 16
} else {
return 0
}
}
return 16
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = UIView()
return view
}
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
let view = UIView()
return view
}
}
......@@ -110,6 +110,11 @@ class YHMyNewViewController: YHBaseViewController {
lazy var vipInfoView: YHUserVipInfoView = {
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
}()
......
//
// 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 {
}
class YHUserVipInfoView: UIView {
var rightButtonEvent: (() -> Void)?
var growValue: Int = 0
var vipLevel: YHUserVipLevel = .none {
......@@ -156,6 +158,7 @@ class YHUserVipInfoView: UIView {
btn.setTitle("更多权益", for: .normal)
btn.setTitleColor(.white, for: .normal)
btn.layer.cornerRadius = 15.0
btn.addTarget(self, action: #selector(rightButtonClicked), for: .touchUpInside)
return btn
}()
......@@ -229,6 +232,10 @@ class YHUserVipInfoView: UIView {
self.update(growValue: 0, vipLevel: .none)
}
@objc func rightButtonClicked() {
rightButtonEvent?()
}
func updateVipLevel(_ vipLevel: YHUserVipLevel) {
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