This commit is contained in:
zeng 2026-03-19 18:05:31 +08:00
parent 40d2260102
commit 5eb4be4a68
95 changed files with 1804 additions and 58 deletions

View File

@ -74,7 +74,7 @@ struct XSStoreAPI {
param.method = .post param.method = .post
param.isLoding = isLoding param.isLoding = isLoding
param.isToast = isToast param.isToast = isToast
param.parameters = parameters // param.parameters = parameters
let response: XSNetwork.Response<XSPayDateModel> = await XSNetwork.request(parameters: param) let response: XSNetwork.Response<XSPayDateModel> = await XSNetwork.request(parameters: param)
return response.data return response.data

View File

@ -6,13 +6,29 @@
// //
import UIKit import UIKit
import SnapKit
class XSCoinsPackViewController: XSViewController { class XSCoinsPackViewController: XSViewController {
private var contentBgBorderImage = UIImage(named: "gradient_color_image_03")
private lazy var mainBgView = UIImageView(image: UIImage(named: "coins_pack_bg_01"))
private lazy var contentBgView: UIImageView = {
let view = UIImageView(image: UIImage(named: "coins_pack_bg_02"))
view.layer.cornerRadius = 26
view.layer.masksToBounds = true
view.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
view.layer.borderWidth = 1
return view
}()
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
self.title = "My Refills".localized
xs_setupUI()
} }
@ -21,5 +37,31 @@ class XSCoinsPackViewController: XSViewController {
self.navigationController?.setNavigationBarHidden(false, animated: true) self.navigationController?.setNavigationBarHidden(false, animated: true)
xs_setNavigationStyle() xs_setNavigationStyle()
} }
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
contentBgBorderImage = contentBgBorderImage?.xs_resized(to: contentBgView.bounds.size)
contentBgView.layer.borderColor = UIColor(patternImage: contentBgBorderImage!).cgColor
}
} }
extension XSCoinsPackViewController {
private func xs_setupUI() {
view.addSubview(mainBgView)
view.addSubview(contentBgView)
mainBgView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
contentBgView.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.top.equalTo(self.view.safeAreaLayoutGuide)
}
}
}

View File

@ -95,6 +95,45 @@ class XSPayItem: NSObject, SmartCodable {
CodingKeys.xs_description <--- ["description"] CodingKeys.xs_description <--- ["description"]
] ]
} }
func getTimeString() -> String? {
switch self.vip_type_key {
case .week:
return "week".localized
case .month:
return "month".localized
case .quarter:
return "quarter".localized
case .year:
return "year".localized
default:
return nil
}
}
func getVipTitle() -> String? {
switch self.vip_type_key {
case .week:
return "Weekly VIP".localized
case .month:
return "Monthly VIP".localized
case .quarter:
return "Quarterly VIP".localized
case .year:
return "Yearly VIP".localized
default:
return nil
}
}
} }
class XSPayExtInfo: NSObject, SmartCodable { class XSPayExtInfo: NSObject, SmartCodable {

View File

@ -6,20 +6,105 @@
// //
import UIKit import UIKit
import SnapKit
class XSStoreCoinsBigCell: XSStoreCell { class XSStoreCoinsBigCell: XSStoreCell {
override var item: XSPayItem? {
didSet {
let coins = item?.coins ?? 0
let sendCoins = item?.send_coins ?? 0
coinsLabel.text = "\(coins)"
if sendCoins > 0 {
sendCoinsLabel.isHidden = false
sendCoinsRatioView.isHidden = false
sendCoinsLabel.text = "+ \(sendCoins) " + "Bonus".localized
let ratio = String(format: "%.0f", CGFloat(sendCoins) / CGFloat(coins) * 100)
sendCoinsRatioLabel.text = "+\(ratio)%"
} else {
sendCoinsLabel.isHidden = true
sendCoinsRatioView.isHidden = true
}
priceLabel.text = "\(item?.currency ?? "")\(item?.price ?? "")"
if let make = item?.corner_marker, !make.isEmpty {
hotView.isHidden = false
} else {
hotView.isHidden = true
}
}
}
private lazy var bgView: XSView = { private lazy var bgView: XSView = {
let view = XSView() let view = XSView()
view.xs_colors = [] view.xs_colors = [UIColor._703_BDE.cgColor, UIColor.D_567_F_1.cgColor]
view.xs_startPoint = .init(x: 0.5, y: 0)
view.xs_endPoint = .init(x: 0.5, y: 1)
view.layer.cornerRadius = 12
view.layer.masksToBounds = true
view.layer.borderWidth = 1
view.layer.borderColor = UIColor.white.withAlphaComponent(0.25).cgColor
return view return view
}() }()
private lazy var coinsContainerView: UIView = {
let view = UIView()
return view
}()
private lazy var coinsIconImageView = UIImageView(image: UIImage(named: "coins_icon_04"))
private lazy var coinsLabel: UILabel = {
let label = UILabel()
label.font = .font(ofSize: 18, weight: .bold)
return label
}()
private lazy var sendCoinsLabel: UILabel = {
let label = UILabel()
label.font = .font(ofSize: 12, weight: .regular)
label.textColor = .white.withAlphaComponent(0.5)
return label
}()
private lazy var priceLabel: UILabel = {
let label = UILabel()
label.backgroundColor = .white
label.layer.cornerRadius = 12
label.layer.masksToBounds = true
label.font = .font(ofSize: 14, weight: .bold)
label.textColor = ._2_A_2_A_2_A
label.textAlignment = .center
return label
}()
private lazy var hotView = UIImageView(image: UIImage(named: "hot_icon_05"))
private lazy var sendCoinsRatioView: UIView = {
let view = UIView()
view.backgroundColor = .white
view.layer.cornerRadius = 8
view.layer.masksToBounds = true
view.layer.maskedCorners = .layerMinXMaxYCorner
return view
}()
private lazy var sendCoinsRatioLabel: UILabel = {
let label = XSLabel()
label.font = .font(ofSize: 14, weight: .bold)
label.textColors = [UIColor._6900_CB.cgColor, UIColor.F_75_FFF.cgColor]
label.textStartPoint = .init(x: 0.5, y: 0)
label.textEndPoint = .init(x: 0.5, y: 1)
return label
}()
override init(frame: CGRect) { override init(frame: CGRect) {
super.init(frame: frame) super.init(frame: frame)
xs_setupUI()
} }
@MainActor required init?(coder: NSCoder) { @MainActor required init?(coder: NSCoder) {
@ -27,3 +112,64 @@ class XSStoreCoinsBigCell: XSStoreCell {
} }
} }
extension XSStoreCoinsBigCell {
private func xs_setupUI() {
contentView.addSubview(bgView)
contentView.addSubview(coinsContainerView)
coinsContainerView.addSubview(coinsIconImageView)
coinsContainerView.addSubview(coinsLabel)
contentView.addSubview(sendCoinsLabel)
contentView.addSubview(priceLabel)
contentView.addSubview(hotView)
bgView.addSubview(sendCoinsRatioView)
sendCoinsRatioView.addSubview(sendCoinsRatioLabel)
bgView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
coinsContainerView.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalToSuperview().offset(14)
}
coinsIconImageView.snp.makeConstraints { make in
make.left.top.bottom.equalToSuperview()
}
coinsLabel.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.left.equalTo(coinsIconImageView.snp.right).offset(5)
make.right.equalToSuperview()
}
sendCoinsLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalTo(coinsContainerView.snp.bottom).offset(6)
}
priceLabel.snp.makeConstraints { make in
make.left.right.equalToSuperview().inset(6)
make.bottom.equalToSuperview().inset(6)
make.height.equalTo(24)
}
hotView.snp.makeConstraints { make in
make.left.equalToSuperview()
make.top.equalToSuperview()
}
sendCoinsRatioView.snp.makeConstraints { make in
make.top.right.equalToSuperview()
make.height.equalTo(18)
}
sendCoinsRatioLabel.snp.makeConstraints { make in
make.center.equalToSuperview()
make.left.equalToSuperview().offset(4)
}
}
}

View File

@ -9,4 +9,162 @@ import UIKit
class XSStoreCoinsSmallCell: XSStoreCell { class XSStoreCoinsSmallCell: XSStoreCell {
override var item: XSPayItem? {
didSet {
let coins = item?.coins ?? 0
let sendCoins = item?.send_coins ?? 0
coinsLabel.text = "\(coins)"
if sendCoins > 0 {
sendCoinsLabel.isHidden = false
sendCoinsRatioView.isHidden = false
sendCoinsLabel.text = "+ \(sendCoins) " + "Bonus".localized
let ratio = String(format: "%.0f", CGFloat(sendCoins) / CGFloat(coins) * 100)
sendCoinsRatioLabel.text = "+\(ratio)%"
} else {
sendCoinsLabel.isHidden = true
sendCoinsRatioView.isHidden = true
}
priceLabel.text = "\(item?.currency ?? "")\(item?.price ?? "")"
if let make = item?.corner_marker, !make.isEmpty {
hotView.isHidden = false
} else {
hotView.isHidden = true
}
}
}
private lazy var bgView: XSView = {
let view = XSView()
view.xs_colors = [UIColor._040_B_36.cgColor, UIColor._6_E_008_B.cgColor]
view.xs_startPoint = .init(x: 0.5, y: 0)
view.xs_endPoint = .init(x: 0.5, y: 1)
view.layer.cornerRadius = 12
view.layer.masksToBounds = true
view.layer.borderWidth = 1
view.layer.borderColor = UIColor.white.withAlphaComponent(0.25).cgColor
return view
}()
private lazy var coinsContainerView: UIView = {
let view = UIView()
return view
}()
private lazy var coinsIconImageView = UIImageView(image: UIImage(named: "coins_icon_04"))
private lazy var coinsLabel: UILabel = {
let label = UILabel()
label.font = .font(ofSize: 18, weight: .bold)
return label
}()
private lazy var sendCoinsLabel: UILabel = {
let label = UILabel()
label.font = .font(ofSize: 10, weight: .regular)
label.textColor = .white.withAlphaComponent(0.5)
return label
}()
private lazy var priceLabel: UILabel = {
let label = UILabel()
label.backgroundColor = .D_567_F_1
label.font = .font(ofSize: 12, weight: .bold)
label.textColor = .white
label.textAlignment = .center
return label
}()
private lazy var hotView = UIImageView(image: UIImage(named: "hot_icon_05"))
private lazy var sendCoinsRatioView: UIView = {
let view = UIView()
view.backgroundColor = .D_567_F_1
view.layer.cornerRadius = 12
view.layer.masksToBounds = true
view.layer.maskedCorners = .layerMinXMaxYCorner
return view
}()
private lazy var sendCoinsRatioLabel: UILabel = {
let label = UILabel()
label.font = .font(ofSize: 14, weight: .bold)
label.textColor = .white
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
xs_setupUI()
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension XSStoreCoinsSmallCell {
private func xs_setupUI() {
contentView.addSubview(bgView)
bgView.addSubview(coinsContainerView)
coinsContainerView.addSubview(coinsIconImageView)
coinsContainerView.addSubview(coinsLabel)
bgView.addSubview(sendCoinsLabel)
bgView.addSubview(priceLabel)
contentView.addSubview(hotView)
bgView.addSubview(sendCoinsRatioView)
sendCoinsRatioView.addSubview(sendCoinsRatioLabel)
bgView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
coinsContainerView.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalToSuperview().offset(25)
}
coinsIconImageView.snp.makeConstraints { make in
make.left.top.bottom.equalToSuperview()
}
coinsLabel.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.left.equalTo(coinsIconImageView.snp.right).offset(5)
make.right.equalToSuperview()
}
sendCoinsLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalTo(coinsContainerView.snp.bottom).offset(5)
}
priceLabel.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.height.equalTo(24)
}
hotView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(1)
make.top.equalToSuperview().offset(-5)
}
sendCoinsRatioView.snp.makeConstraints { make in
make.top.right.equalToSuperview()
make.height.equalTo(18)
}
sendCoinsRatioLabel.snp.makeConstraints { make in
make.center.equalToSuperview()
make.left.equalToSuperview().offset(4)
}
}
} }

View File

@ -6,7 +6,191 @@
// //
import UIKit import UIKit
import SnapKit
class XSStoreCoinsSpreadCell: XSStoreCell { class XSStoreCoinsSpreadCell: XSStoreCell {
override var item: XSPayItem? {
didSet {
coinsLabel.text = "\(item?.ext_info?.max_total_coins ?? 0)"
if let text = item?.ext_info?.receive_coins_rate, !text.isEmpty {
ratioLabel.text = text
ratioBgView.isHidden = false
} else {
ratioBgView.isHidden = true
}
priceView.setNeedsUpdateConfiguration()
}
}
private lazy var bgView: UIView = {
let view = UIImageView(image: UIImage(named: "spread_bg_image_01"))
view.layer.cornerRadius = 12
view.layer.masksToBounds = true
return view
}()
private lazy var bgCoinsView: UIImageView = {
let view = UIImageView(image: UIImage(named: "spread_bg_coins_01"))
return view
}()
private lazy var titleLabel: UILabel = {
let label = XSLabel()
label.font = .font(ofSize: 16, weight: .bold).withBoldItalic()
label.textColors = [UIColor.BA_8_A_2_A.cgColor, UIColor._8_B_5801.cgColor]
label.textStartPoint = .init(x: 0, y: 0.5)
label.textEndPoint = .init(x: 1, y: 0.5)
label.text = "Weekly Refill".localized
return label
}()
private lazy var coinsIconImageView = UIImageView(image: UIImage(named: "coins_icon_05"))
private lazy var coinsLabel: UILabel = {
let label = UILabel()
label.font = .font(ofSize: 18, weight: .bold)
label.textColor = ._8_B_5801
return label
}()
private lazy var ratioBgView: UIView = {
let view = UIView()
view.backgroundColor = .black.withAlphaComponent(0.25)
view.layer.cornerRadius = 9
view.layer.masksToBounds = true
return view
}()
private lazy var ratioLabel: UILabel = {
let label = UILabel()
label.font = .font(ofSize: 12, weight: .regular)
label.textColor = .FFF_4_C_8
return label
}()
private lazy var priceView: UIButton = {
var config = UIButton.Configuration.plain()
config.background.backgroundColor = .white
config.titleAlignment = .center
config.titlePadding = 0
config.contentInsets = .init(top: 0, leading: 10, bottom: 0, trailing: 10)
let button = UIButton(configuration: config)
button.isUserInteractionEnabled = false
button.layer.masksToBounds = true
button.layer.cornerRadius = 24
button.configurationUpdateHandler = { [weak self] button in
guard let self = self else { return }
let currency = self.item?.currency ?? ""
let timeText = self.item?.getTimeString() ?? ""
let oldPrice = self.item?.price ?? ""
var discountPrice: String? = self.item?.discount_price
if let discountPrice = discountPrice {
let priceString = AttributedString("\(currency)\(discountPrice)", attributes: AttributeContainer([
.font : UIFont.font(ofSize: 18, weight: .bold),
.foregroundColor : UIColor._946_A_37
]))
button.configuration?.attributedTitle = priceString
var subtitle = AttributedString("\(currency)\(oldPrice)", attributes: AttributeContainer([
.font : UIFont.font(ofSize: 12, weight: .regular),
.foregroundColor : UIColor.black.withAlphaComponent(0.05),
.strikethroughStyle: NSUnderlineStyle.double.rawValue,
.strikethroughColor: UIColor.black.withAlphaComponent(0.05)
]))
button.configuration?.attributedSubtitle = subtitle
} else {
button.configuration?.attributedTitle = AttributedString("\(currency)\(oldPrice)", attributes: AttributeContainer([
.font : UIFont.font(ofSize: 18, weight: .bold),
.foregroundColor : UIColor._946_A_37
]))
button.configuration?.attributedSubtitle = AttributedString("/\(timeText)", attributes: AttributeContainer([
.font : UIFont.font(ofSize: 12, weight: .regular),
.foregroundColor : UIColor.black.withAlphaComponent(0.5)
]))
}
}
return button
}()
override init(frame: CGRect) {
super.init(frame: frame)
xs_setupUI()
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension XSStoreCoinsSpreadCell {
private func xs_setupUI() {
contentView.addSubview(bgView)
bgView.addSubview(bgCoinsView)
bgView.addSubview(titleLabel)
bgView.addSubview(coinsIconImageView)
bgView.addSubview(coinsLabel)
bgView.addSubview(ratioBgView)
ratioBgView.addSubview(ratioLabel)
bgView.addSubview(priceView)
bgView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
bgCoinsView.snp.makeConstraints { make in
make.left.bottom.equalToSuperview()
}
titleLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(72)
make.top.equalToSuperview().offset(19)
}
coinsIconImageView.snp.makeConstraints { make in
make.left.equalTo(titleLabel)
make.bottom.equalToSuperview().inset(21)
}
coinsLabel.snp.makeConstraints { make in
make.centerY.equalTo(coinsIconImageView)
make.left.equalTo(coinsIconImageView.snp.right).offset(4)
}
ratioBgView.snp.makeConstraints { make in
make.centerY.equalTo(coinsIconImageView)
make.left.equalTo(coinsLabel.snp.right).offset(4)
make.height.equalTo(18)
}
ratioLabel.snp.makeConstraints { make in
make.center.equalToSuperview()
make.left.equalToSuperview().offset(8)
}
priceView.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-12)
make.centerY.equalToSuperview()
make.height.equalTo(48)
make.width.greaterThanOrEqualTo(88)
}
}
} }

View File

@ -126,6 +126,7 @@ extension XSStoreCoinsView {
collectionView.snp.makeConstraints { make in collectionView.snp.makeConstraints { make in
make.top.equalToSuperview().offset(36) make.top.equalToSuperview().offset(36)
make.left.right.equalToSuperview().inset(16) make.left.right.equalToSuperview().inset(16)
make.bottom.equalToSuperview()
make.height.equalTo(1) make.height.equalTo(1)
} }
} }
@ -150,13 +151,16 @@ extension XSStoreCoinsView {
} }
private func smallLayoutSection(_ environment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection { private func smallLayoutSection(_ environment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection {
let item = NSCollectionLayoutItem(layoutSize: .init(widthDimension: .fractionalWidth(1 / 3), heightDimension: .fractionalHeight(1))) let contentWidth = environment.container.effectiveContentSize.width
let itemWidth = floor((contentWidth - 30) / 3)
let item = NSCollectionLayoutItem(layoutSize: .init(widthDimension: .absolute(itemWidth), heightDimension: .fractionalHeight(1)))
let group = NSCollectionLayoutGroup.horizontal(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .absolute(121)), subitems: [item]) let group = NSCollectionLayoutGroup.horizontal(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .absolute(84)), subitems: [item])
group.interItemSpacing = .fixed(8) group.interItemSpacing = .fixed(15)
let layoutSection = NSCollectionLayoutSection(group: group) let layoutSection = NSCollectionLayoutSection(group: group)
layoutSection.interGroupSpacing = 10 layoutSection.interGroupSpacing = 12
layoutSection.contentInsets = .zero layoutSection.contentInsets = .zero
return layoutSection return layoutSection
} }
@ -168,7 +172,7 @@ extension XSStoreCoinsView {
let layoutSection = NSCollectionLayoutSection(group: group) let layoutSection = NSCollectionLayoutSection(group: group)
layoutSection.interGroupSpacing = 10 layoutSection.interGroupSpacing = 12
layoutSection.contentInsets = .zero layoutSection.contentInsets = .zero
return layoutSection return layoutSection
} }
@ -179,7 +183,7 @@ extension XSStoreCoinsView: UICollectionViewDelegate, UICollectionViewDataSource
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let item = dataArr[indexPath.section][indexPath.row] let item = dataArr[indexPath.section][indexPath.row]
var identifier = item.size?.rawValue ?? "" let identifier = item.size?.rawValue ?? ""
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath) as! XSStoreCell let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath) as! XSStoreCell
cell.item = item cell.item = item
cell.xs_isSelected = selectedIndexPath == indexPath cell.xs_isSelected = selectedIndexPath == indexPath
@ -199,7 +203,7 @@ extension XSStoreCoinsView: UICollectionViewDelegate, UICollectionViewDataSource
self.selectedIndexPath = indexPath self.selectedIndexPath = indexPath
collectionView.reloadData() collectionView.reloadData()
// if model.buy_type == .subCoins { if model.buy_type == .subCoins {
// let view = FACoinPackConfirmView() // let view = FACoinPackConfirmView()
// view.shortPlayId = self.shortPlayId // view.shortPlayId = self.shortPlayId
// view.videoId = self.videoId // view.videoId = self.videoId
@ -210,15 +214,17 @@ extension XSStoreCoinsView: UICollectionViewDelegate, UICollectionViewDataSource
// self.buyFinishHandle?() // self.buyFinishHandle?()
// } // }
// view.present(in: nil) // view.present(in: nil)
// } else { } else {
// FAIapManager.manager.start(model: model, shortPlayId: self.shortPlayId, videoId: self.videoId) { [weak self] finish in XSIapManager.manager.start(model: model, shortPlayId: self.shortPlayId, videoId: self.videoId) { [weak self] finish in
// guard let self = self else { return } guard let self = self else { return }
// if finish { if finish {
// FALogin.manager.requestUserInfo(completer: nil) Task {
// self.buyFinishHandle?() await XSLoginManager.manager.updateUserInfo()
// } }
// } self.buyFinishHandle?()
// } }
}
}
} }

View File

@ -6,7 +6,245 @@
// //
import UIKit import UIKit
import SnapKit
class XSStoreVipCell: XSStoreCell { class XSStoreVipCell: XSStoreCell {
override var item: XSPayItem? {
didSet {
titleLabel.text = item?.getVipTitle()
expiresLabel.text = item?.xs_description
switch item?.vip_type_key {
case .week:
bgView.image = UIImage(named: "store_vip_week_bg_image")
bgView.layer.borderColor = UIColor.FFDAA_4.cgColor
bgDiamondView.image = UIImage(named: "store_vip_week_diamond_image")
titleBgView.xs_colors = [UIColor.white.cgColor, UIColor.white.cgColor, UIColor.white.cgColor]
titleIconView.image = UIImage(named: "store_vip_title_week_icon")
titleLabel.textColor = ._523927
priceLabel.textColor = ._4_A_1341
timeLabel.textColor = ._4_C_0053
sendCoinsBgView.xs_colors = [UIColor.FF_7373.cgColor, UIColor.F_770_E_8.cgColor, UIColor.DF_84_FF.cgColor]
sendCoinsLabel.textColor = .white
case .month:
bgView.image = UIImage(named: "store_vip_month_bg_image")
bgView.layer.borderColor = UIColor.FFDAA_4.cgColor
bgDiamondView.image = UIImage(named: "store_vip_month_diamond_image")
titleBgView.xs_colors = [UIColor.white.cgColor, UIColor.white.cgColor, UIColor.white.cgColor]
titleIconView.image = UIImage(named: "store_vip_title_month_icon")
titleLabel.textColor = ._523927
priceLabel.textColor = ._4_A_1913
timeLabel.textColor = ._530000
sendCoinsBgView.xs_colors = [UIColor.FF_7373.cgColor, UIColor.F_770_E_8.cgColor, UIColor.DF_84_FF.cgColor]
sendCoinsLabel.textColor = .white
case .quarter:
bgView.image = UIImage(named: "store_vip_quarter_bg_image")
bgView.layer.borderColor = UIColor.FFDAA_4.cgColor
bgDiamondView.image = UIImage(named: "store_vip_quarter_diamond_image")
titleBgView.xs_colors = [UIColor.white.cgColor, UIColor.white.cgColor, UIColor.white.cgColor]
titleIconView.image = UIImage(named: "store_vip_title_quarter_icon")
titleLabel.textColor = ._523927
priceLabel.textColor = ._523927
timeLabel.textColor = ._523927
sendCoinsBgView.xs_colors = [UIColor.FF_7373.cgColor, UIColor.F_770_E_8.cgColor, UIColor.DF_84_FF.cgColor]
sendCoinsLabel.textColor = .white
case .year:
bgView.image = UIImage(named: "store_vip_year_bg_image")
bgView.layer.borderColor = UIColor._80776_A.cgColor
bgDiamondView.image = UIImage(named: "store_vip_year_diamond_image")
titleBgView.xs_colors = [UIColor.FFC_445.cgColor, UIColor.FFF_2_A_8.cgColor, UIColor.FFC_94_B.cgColor]
titleIconView.image = UIImage(named: "store_vip_title_year_icon")
titleLabel.textColor = ._492_D_2_A
priceLabel.textColor = .FFD_2_AA
timeLabel.textColor = .FFD_2_AA
sendCoinsBgView.xs_colors = [UIColor.FFC_445.cgColor, UIColor.FFF_2_A_8.cgColor, UIColor.FFC_94_B.cgColor]
sendCoinsLabel.textColor = ._523927
default:
break
}
expiresLabel.textColor = timeLabel.textColor
let currency = item?.currency ?? ""
let oldPrice = item?.price ?? ""
let time = "/\(item?.getTimeString() ?? "")"
let offerPrice = item?.discount_price
if let price = offerPrice {
priceLabel.text = currency + " " + price
let oldPriceStr = NSMutableAttributedString(string: oldPrice)
oldPriceStr.yy_strikethroughColor = timeLabel.textColor
oldPriceStr.yy_strikethroughStyle = .double
timeLabel.attributedText = oldPriceStr
} else {
priceLabel.text = currency + " " + oldPrice
let timeStr = NSMutableAttributedString(string: time)
timeLabel.attributedText = timeStr
}
if let coins = item?.send_coins, coins > 0 {
sendCoinsBgView.isHidden = false
sendCoinsLabel.text = "+ Extra ## Bonus".localizedReplace(text: "\(coins)")
} else {
sendCoinsBgView.isHidden = true
}
}
}
private lazy var bgView: UIImageView = {
let view = UIImageView()
view.layer.cornerRadius = 12
view.layer.masksToBounds = true
view.layer.borderWidth = 1
return view
}()
private lazy var bgDiamondView: UIImageView = {
let imageView = UIImageView()
return imageView
}()
private lazy var titleBgView: XSView = {
let view = XSView()
view.layer.cornerRadius = 18
view.layer.masksToBounds = true
view.layer.maskedCorners = .layerMaxXMaxYCorner
view.xs_startPoint = .init(x: 0, y: 0.5)
view.xs_endPoint = .init(x: 1, y: 0.5)
return view
}()
private lazy var titleIconView: UIImageView = {
let imageView = UIImageView()
return imageView
}()
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.font = .font(ofSize: 14, weight: .bold)
return label
}()
private lazy var priceLabel: UILabel = {
let label = UILabel()
label.font = .font(ofSize: 22, weight: .semibold)
return label
}()
private lazy var timeLabel: UILabel = {
let label = UILabel()
label.font = .font(ofSize: 12, weight: .regular)
return label
}()
private lazy var expiresLabel: UILabel = {
let label = UILabel()
label.font = .font(ofSize: 10, weight: .regular).withBoldItalic()
return label
}()
private lazy var sendCoinsBgView: XSView = {
let view = XSView()
view.xs_startPoint = .init(x: 0, y: 0.5)
view.xs_endPoint = .init(x: 1, y: 0.5)
view.layer.cornerRadius = 9
view.layer.masksToBounds = true
view.layer.maskedCorners = [.layerMinXMinYCorner, .layerMinXMaxYCorner]
return view
}()
private lazy var sendCoinsLabel: UILabel = {
let label = UILabel()
label.font = .font(ofSize: 12, weight: .bold).withBoldItalic()
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
xs_setupUI()
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension XSStoreVipCell {
private func xs_setupUI() {
contentView.addSubview(bgView)
bgView.addSubview(bgDiamondView)
bgView.addSubview(titleBgView)
titleBgView.addSubview(titleIconView)
titleBgView.addSubview(titleLabel)
bgView.addSubview(priceLabel)
bgView.addSubview(timeLabel)
bgView.addSubview(expiresLabel)
bgView.addSubview(sendCoinsBgView)
sendCoinsBgView.addSubview(sendCoinsLabel)
bgView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
bgDiamondView.snp.makeConstraints { make in
make.right.equalToSuperview().inset(29)
make.top.equalToSuperview().inset(8)
}
titleBgView.snp.makeConstraints { make in
make.left.top.equalToSuperview()
make.height.equalTo(24)
}
titleIconView.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.left.equalToSuperview().offset(12)
}
titleLabel.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.left.equalTo(titleIconView.snp.right).offset(4)
make.right.equalToSuperview().offset(-12)
}
priceLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(17)
make.centerY.equalToSuperview()
}
timeLabel.snp.makeConstraints { make in
make.centerY.equalToSuperview().offset(1)
make.left.equalTo(priceLabel.snp.right).offset(6)
}
expiresLabel.snp.makeConstraints { make in
make.left.equalTo(priceLabel)
make.bottom.equalToSuperview().offset(-10)
}
sendCoinsBgView.snp.makeConstraints { make in
make.right.top.equalToSuperview()
make.height.equalTo(18)
}
sendCoinsLabel.snp.makeConstraints { make in
make.center.equalToSuperview()
make.left.equalToSuperview().offset(6)
}
}
} }

View File

@ -41,10 +41,10 @@ class XSStoreVipView: UIView {
let item = NSCollectionLayoutItem(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .fractionalHeight(1))) let item = NSCollectionLayoutItem(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .fractionalHeight(1)))
let group = NSCollectionLayoutGroup.horizontal(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .absolute(110)), subitems: [item]) let group = NSCollectionLayoutGroup.horizontal(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .absolute(84)), subitems: [item])
let layoutSection = NSCollectionLayoutSection(group: group) let layoutSection = NSCollectionLayoutSection(group: group)
layoutSection.interGroupSpacing = 14 layoutSection.interGroupSpacing = 12
layoutSection.contentInsets = .init(top: 0, leading: 16, bottom: 0, trailing: 16) layoutSection.contentInsets = .init(top: 0, leading: 16, bottom: 0, trailing: 16)
@ -133,13 +133,15 @@ extension XSStoreVipView: UICollectionViewDelegate, UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let model = self.dataArr[indexPath.row] let model = self.dataArr[indexPath.row]
// FAIapManager.manager.start(model: model, shortPlayId: self.shortPlayId, videoId: self.videoId) { [weak self] finish in XSIapManager.manager.start(model: model, shortPlayId: self.shortPlayId, videoId: self.videoId) { [weak self] finish in
// guard let self = self else { return } guard let self = self else { return }
// if finish { if finish {
// FALogin.manager.requestUserInfo(completer: nil) Task {
// self.buyFinishHandle?() await XSLoginManager.manager.updateUserInfo()
// } }
// } self.buyFinishHandle?()
}
}
} }
} }

View File

@ -97,36 +97,36 @@ extension XSPayDataRequest: SKProductsRequestDelegate {
var newCoinList: [XSPayItem] = [] var newCoinList: [XSPayItem] = []
var newVipList: [XSPayItem] = [] var newVipList: [XSPayItem] = []
templateModel.list_coins?.forEach { item in // templateModel.list_coins?.forEach { item in
let productId = XSIapManager.manager.getProductId(templateId: item.ios_template_id) ?? "" // let productId = XSIapManager.manager.getProductId(templateId: item.ios_template_id) ?? ""
for product in products { // for product in products {
if productId == product.productIdentifier { // if productId == product.productIdentifier {
item.price = product.price.stringValue // item.price = product.price.stringValue
item.currency = product.priceLocale.currencySymbol // item.currency = product.priceLocale.currencySymbol
item.product = product // item.product = product
newCoinList.append(item) // newCoinList.append(item)
break // break
} // }
} // }
} // }
//
templateModel.list_sub_vip?.forEach { item in // templateModel.list_sub_vip?.forEach { item in
let productId = XSIapManager.manager.getProductId(templateId: item.ios_template_id) ?? "" // let productId = XSIapManager.manager.getProductId(templateId: item.ios_template_id) ?? ""
for product in products { // for product in products {
if productId == product.productIdentifier { // if productId == product.productIdentifier {
item.price = product.price.stringValue // item.price = product.price.stringValue
item.currency = product.priceLocale.currencySymbol // item.currency = product.priceLocale.currencySymbol
item.product = product // item.product = product
newVipList.append(item) // newVipList.append(item)
break // break
} // }
} // }
} // }
templateModel.list_coins = newCoinList // templateModel.list_coins = newCoinList
templateModel.list_sub_vip = newVipList // templateModel.list_sub_vip = newVipList
if let block = self.completerBlock { if let block = self.completerBlock {

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x36",
"green" : "0x0B",
"red" : "0x04"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x2A",
"green" : "0x2A",
"red" : "0x2A"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x2A",
"green" : "0x2D",
"red" : "0x49"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x41",
"green" : "0x13",
"red" : "0x4A"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x13",
"green" : "0x19",
"red" : "0x4A"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x53",
"green" : "0x00",
"red" : "0x4C"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x00",
"green" : "0x00",
"red" : "0x53"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xCB",
"green" : "0x00",
"red" : "0x69"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x8B",
"green" : "0x00",
"red" : "0x6E"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xDE",
"green" : "0x3B",
"red" : "0x70"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x6A",
"green" : "0x77",
"red" : "0x80"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x01",
"green" : "0x58",
"red" : "0x8B"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x37",
"green" : "0x6A",
"red" : "0x94"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x2A",
"green" : "0x8A",
"red" : "0xBA"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xF1",
"green" : "0x67",
"red" : "0xD5"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xFF",
"green" : "0x84",
"red" : "0xDF"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xFF",
"green" : "0x5F",
"red" : "0xF7"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xE8",
"green" : "0x70",
"red" : "0xF7"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x73",
"green" : "0x73",
"red" : "0xFF"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x45",
"green" : "0xC4",
"red" : "0xFF"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x4B",
"green" : "0xC9",
"red" : "0xFF"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xAA",
"green" : "0xD2",
"red" : "0xFF"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xA8",
"green" : "0xF2",
"red" : "0xFF"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xC8",
"green" : "0xF4",
"red" : "0xFF"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 628 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "花瓣素材_emoji热门HOT火焰图形贴纸_193856377@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "花瓣素材_emoji热门HOT火焰图形贴纸_193856377@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

View File

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

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

View File

@ -63,6 +63,17 @@
"VIP Membership" = "VIP Membership"; "VIP Membership" = "VIP Membership";
"Auto renew,cancel anytime" = "Auto renew,cancel anytime"; "Auto renew,cancel anytime" = "Auto renew,cancel anytime";
"Daily Coins" = "Daily Coins"; "Daily Coins" = "Daily Coins";
"Weekly Refill" = "Weekly Refill";
"week" = "week";
"month" = "month";
"quarter" = "quarter";
"year" = "year";
"Weekly VIP" = "Weekly VIP";
"Monthly VIP" = "Monthly VIP";
"Quarterly VIP" = "Quarterly VIP";
"Yearly VIP" = "Yearly VIP";
"+ Extra ## Bonus" = "+ Extra ## Bonus";
"My Refills" = "My Refills";
"me_daily_1" = "Daily reward ready!"; "me_daily_1" = "Daily reward ready!";
"me_daily_2" = "Claim your rewards now."; "me_daily_2" = "Claim your rewards now.";