同步商城修改
@ -162,6 +162,12 @@
|
|||||||
BFCCE13D2DFFFAC500EDE165 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFCCE13B2DFFFAC500EDE165 /* NotificationService.swift */; };
|
BFCCE13D2DFFFAC500EDE165 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFCCE13B2DFFFAC500EDE165 /* NotificationService.swift */; };
|
||||||
BFCCE1402E000ACE00EDE165 /* VPAnpsAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFCCE13F2E000ACE00EDE165 /* VPAnpsAlertView.swift */; };
|
BFCCE1402E000ACE00EDE165 /* VPAnpsAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFCCE13F2E000ACE00EDE165 /* VPAnpsAlertView.swift */; };
|
||||||
BFCCE1422E000F4800EDE165 /* VPHomePlayHistoricalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFCCE1412E000F4800EDE165 /* VPHomePlayHistoricalView.swift */; };
|
BFCCE1422E000F4800EDE165 /* VPHomePlayHistoricalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFCCE1412E000F4800EDE165 /* VPHomePlayHistoricalView.swift */; };
|
||||||
|
BFA21D982E01477200B3573D /* VPStoreViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA21D972E01477200B3573D /* VPStoreViewController.swift */; };
|
||||||
|
BFA21D9A2E01497F00B3573D /* VPStoreVipBuyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA21D992E01497F00B3573D /* VPStoreVipBuyView.swift */; };
|
||||||
|
BFA21D9C2E01628F00B3573D /* VPStoreCoinsBuyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA21D9B2E01628F00B3573D /* VPStoreCoinsBuyView.swift */; };
|
||||||
|
BFA21D9E2E01684E00B3573D /* VPStoreCoinsItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA21D9D2E01684E00B3573D /* VPStoreCoinsItemView.swift */; };
|
||||||
|
BFA21DA02E01688D00B3573D /* VPStoreCoinsBigItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA21D9F2E01688D00B3573D /* VPStoreCoinsBigItemView.swift */; };
|
||||||
|
BFA21DA22E01696700B3573D /* VPStoreCoinsSmallItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA21DA12E01696700B3573D /* VPStoreCoinsSmallItemView.swift */; };
|
||||||
BFF5AFA42DE6F15E0044227A /* VPMeVipCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFA32DE6F15E0044227A /* VPMeVipCell.swift */; };
|
BFF5AFA42DE6F15E0044227A /* VPMeVipCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFA32DE6F15E0044227A /* VPMeVipCell.swift */; };
|
||||||
BFF5AFA62DE700420044227A /* VPMeVipPrivilegeItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFA52DE700420044227A /* VPMeVipPrivilegeItemView.swift */; };
|
BFF5AFA62DE700420044227A /* VPMeVipPrivilegeItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFA52DE700420044227A /* VPMeVipPrivilegeItemView.swift */; };
|
||||||
BFF5AFA82DE704DC0044227A /* VPMeCoinCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFA72DE704DC0044227A /* VPMeCoinCell.swift */; };
|
BFF5AFA82DE704DC0044227A /* VPMeCoinCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5AFA72DE704DC0044227A /* VPMeCoinCell.swift */; };
|
||||||
@ -427,6 +433,12 @@
|
|||||||
BFCCE13B2DFFFAC500EDE165 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = "<group>"; };
|
BFCCE13B2DFFFAC500EDE165 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = "<group>"; };
|
||||||
BFCCE13F2E000ACE00EDE165 /* VPAnpsAlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPAnpsAlertView.swift; sourceTree = "<group>"; };
|
BFCCE13F2E000ACE00EDE165 /* VPAnpsAlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPAnpsAlertView.swift; sourceTree = "<group>"; };
|
||||||
BFCCE1412E000F4800EDE165 /* VPHomePlayHistoricalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPHomePlayHistoricalView.swift; sourceTree = "<group>"; };
|
BFCCE1412E000F4800EDE165 /* VPHomePlayHistoricalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPHomePlayHistoricalView.swift; sourceTree = "<group>"; };
|
||||||
|
BFA21D972E01477200B3573D /* VPStoreViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPStoreViewController.swift; sourceTree = "<group>"; };
|
||||||
|
BFA21D992E01497F00B3573D /* VPStoreVipBuyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPStoreVipBuyView.swift; sourceTree = "<group>"; };
|
||||||
|
BFA21D9B2E01628F00B3573D /* VPStoreCoinsBuyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPStoreCoinsBuyView.swift; sourceTree = "<group>"; };
|
||||||
|
BFA21D9D2E01684E00B3573D /* VPStoreCoinsItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPStoreCoinsItemView.swift; sourceTree = "<group>"; };
|
||||||
|
BFA21D9F2E01688D00B3573D /* VPStoreCoinsBigItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPStoreCoinsBigItemView.swift; sourceTree = "<group>"; };
|
||||||
|
BFA21DA12E01696700B3573D /* VPStoreCoinsSmallItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPStoreCoinsSmallItemView.swift; sourceTree = "<group>"; };
|
||||||
BFF5AFA32DE6F15E0044227A /* VPMeVipCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPMeVipCell.swift; sourceTree = "<group>"; };
|
BFF5AFA32DE6F15E0044227A /* VPMeVipCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPMeVipCell.swift; sourceTree = "<group>"; };
|
||||||
BFF5AFA52DE700420044227A /* VPMeVipPrivilegeItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPMeVipPrivilegeItemView.swift; sourceTree = "<group>"; };
|
BFF5AFA52DE700420044227A /* VPMeVipPrivilegeItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPMeVipPrivilegeItemView.swift; sourceTree = "<group>"; };
|
||||||
BFF5AFA72DE704DC0044227A /* VPMeCoinCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPMeCoinCell.swift; sourceTree = "<group>"; };
|
BFF5AFA72DE704DC0044227A /* VPMeCoinCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPMeCoinCell.swift; sourceTree = "<group>"; };
|
||||||
@ -1208,6 +1220,7 @@
|
|||||||
BFF5AFBC2DE837790044227A /* Controller */ = {
|
BFF5AFBC2DE837790044227A /* Controller */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
BFA21D972E01477200B3573D /* VPStoreViewController.swift */,
|
||||||
BFF5AFAD2DE717BB0044227A /* VPVipPageViewController.swift */,
|
BFF5AFAD2DE717BB0044227A /* VPVipPageViewController.swift */,
|
||||||
BFF5AFAF2DE7F9A80044227A /* VPVipViewController.swift */,
|
BFF5AFAF2DE7F9A80044227A /* VPVipViewController.swift */,
|
||||||
BFF5AFB32DE7FF4E0044227A /* VPCoinsViewController.swift */,
|
BFF5AFB32DE7FF4E0044227A /* VPCoinsViewController.swift */,
|
||||||
@ -1234,6 +1247,11 @@
|
|||||||
BFF5AFD32DE9A5FB0044227A /* VPVIPRecordCell.swift */,
|
BFF5AFD32DE9A5FB0044227A /* VPVIPRecordCell.swift */,
|
||||||
BFF5B2512DF130E00044227A /* VPConsumptionRecordsCell.swift */,
|
BFF5B2512DF130E00044227A /* VPConsumptionRecordsCell.swift */,
|
||||||
BFF5B2592DF13BE50044227A /* VPGiveCoinRecordsCell.swift */,
|
BFF5B2592DF13BE50044227A /* VPGiveCoinRecordsCell.swift */,
|
||||||
|
BFA21D992E01497F00B3573D /* VPStoreVipBuyView.swift */,
|
||||||
|
BFA21D9B2E01628F00B3573D /* VPStoreCoinsBuyView.swift */,
|
||||||
|
BFA21D9D2E01684E00B3573D /* VPStoreCoinsItemView.swift */,
|
||||||
|
BFA21D9F2E01688D00B3573D /* VPStoreCoinsBigItemView.swift */,
|
||||||
|
BFA21DA12E01696700B3573D /* VPStoreCoinsSmallItemView.swift */,
|
||||||
);
|
);
|
||||||
path = View;
|
path = View;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -1500,6 +1518,7 @@
|
|||||||
BF0FA78B2DE164C100C9E5F2 /* VPSearchResultCell.swift in Sources */,
|
BF0FA78B2DE164C100C9E5F2 /* VPSearchResultCell.swift in Sources */,
|
||||||
BF0FA71D2DDC807200C9E5F2 /* UIImageView+VPAdd.swift in Sources */,
|
BF0FA71D2DDC807200C9E5F2 /* UIImageView+VPAdd.swift in Sources */,
|
||||||
BFF5B22C2DEFE8A80044227A /* VPDeleteAccountViewController.swift in Sources */,
|
BFF5B22C2DEFE8A80044227A /* VPDeleteAccountViewController.swift in Sources */,
|
||||||
|
BFA21D9E2E01684E00B3573D /* VPStoreCoinsItemView.swift in Sources */,
|
||||||
BF0FA6DC2DDC5CD700C9E5F2 /* VPTokenModel.swift in Sources */,
|
BF0FA6DC2DDC5CD700C9E5F2 /* VPTokenModel.swift in Sources */,
|
||||||
BF0FA7572DDF159B00C9E5F2 /* VPExploreViewController.swift in Sources */,
|
BF0FA7572DDF159B00C9E5F2 /* VPExploreViewController.swift in Sources */,
|
||||||
1B056E772DDB3641007EE38D /* VPTabBarItemNormalVew.swift in Sources */,
|
1B056E772DDB3641007EE38D /* VPTabBarItemNormalVew.swift in Sources */,
|
||||||
@ -1603,11 +1622,13 @@
|
|||||||
BFF5AFC82DE9473B0044227A /* VPCoinsBuyCell.swift in Sources */,
|
BFF5AFC82DE9473B0044227A /* VPCoinsBuyCell.swift in Sources */,
|
||||||
BF0FA72C2DDD7B7300C9E5F2 /* VPHomeRankingContentCell.swift in Sources */,
|
BF0FA72C2DDD7B7300C9E5F2 /* VPHomeRankingContentCell.swift in Sources */,
|
||||||
BF0FA7AF2DE443E000C9E5F2 /* VPMeViewController.swift in Sources */,
|
BF0FA7AF2DE443E000C9E5F2 /* VPMeViewController.swift in Sources */,
|
||||||
|
BFA21DA02E01688D00B3573D /* VPStoreCoinsBigItemView.swift in Sources */,
|
||||||
BF0FA7942DE16E9300C9E5F2 /* JXTagView.swift in Sources */,
|
BF0FA7942DE16E9300C9E5F2 /* JXTagView.swift in Sources */,
|
||||||
BF0FA7A52DE4384100C9E5F2 /* AttributedString+VPAdd.swift in Sources */,
|
BF0FA7A52DE4384100C9E5F2 /* AttributedString+VPAdd.swift in Sources */,
|
||||||
BF0FA7652DE00A0E00C9E5F2 /* VPDetailPlayerControlView.swift in Sources */,
|
BF0FA7652DE00A0E00C9E5F2 /* VPDetailPlayerControlView.swift in Sources */,
|
||||||
BF0FA7342DDEC74500C9E5F2 /* VPCategoryModel.swift in Sources */,
|
BF0FA7342DDEC74500C9E5F2 /* VPCategoryModel.swift in Sources */,
|
||||||
BFF5B2322DEFF1220044227A /* VPDeleteAccountDetailView.swift in Sources */,
|
BFF5B2322DEFF1220044227A /* VPDeleteAccountDetailView.swift in Sources */,
|
||||||
|
BFA21D9A2E01497F00B3573D /* VPStoreVipBuyView.swift in Sources */,
|
||||||
1B056E4F2DDAC7FC007EE38D /* VPNavigationController.swift in Sources */,
|
1B056E4F2DDAC7FC007EE38D /* VPNavigationController.swift in Sources */,
|
||||||
1B056E3F2DDAC2DB007EE38D /* VPCryptorService.swift in Sources */,
|
1B056E3F2DDAC2DB007EE38D /* VPCryptorService.swift in Sources */,
|
||||||
BF0FA7202DDC83AE00C9E5F2 /* JXButton.swift in Sources */,
|
BF0FA7202DDC83AE00C9E5F2 /* JXButton.swift in Sources */,
|
||||||
@ -1638,6 +1659,7 @@
|
|||||||
BF0FA7022DDC667C00C9E5F2 /* VPVideoInfoModel.swift in Sources */,
|
BF0FA7022DDC667C00C9E5F2 /* VPVideoInfoModel.swift in Sources */,
|
||||||
BF0FA77B2DE0788A00C9E5F2 /* UIStackView+VPAdd.swift in Sources */,
|
BF0FA77B2DE0788A00C9E5F2 /* UIStackView+VPAdd.swift in Sources */,
|
||||||
BF0FA7BE2DE4592A00C9E5F2 /* UserDefaults+VPAdd.swift in Sources */,
|
BF0FA7BE2DE4592A00C9E5F2 /* UserDefaults+VPAdd.swift in Sources */,
|
||||||
|
BFA21DA22E01696700B3573D /* VPStoreCoinsSmallItemView.swift in Sources */,
|
||||||
BFF5B2232DEEF8DA0044227A /* VPLoginButton.swift in Sources */,
|
BFF5B2232DEEF8DA0044227A /* VPLoginButton.swift in Sources */,
|
||||||
BF0FA76F2DE062A700C9E5F2 /* VPRateSelectedView.swift in Sources */,
|
BF0FA76F2DE062A700C9E5F2 /* VPRateSelectedView.swift in Sources */,
|
||||||
BF0FA7772DE0735800C9E5F2 /* VPSearchInputView.swift in Sources */,
|
BF0FA7772DE0735800C9E5F2 /* VPSearchInputView.swift in Sources */,
|
||||||
@ -1654,6 +1676,7 @@
|
|||||||
BFF5B2392DF014520044227A /* VPBaseAlertView.swift in Sources */,
|
BFF5B2392DF014520044227A /* VPBaseAlertView.swift in Sources */,
|
||||||
BFF5AFCC2DE98C7F0044227A /* VPOrderRecordsViewController.swift in Sources */,
|
BFF5AFCC2DE98C7F0044227A /* VPOrderRecordsViewController.swift in Sources */,
|
||||||
1B056E412DDAC30A007EE38D /* VPModel.swift in Sources */,
|
1B056E412DDAC30A007EE38D /* VPModel.swift in Sources */,
|
||||||
|
BFA21D982E01477200B3573D /* VPStoreViewController.swift in Sources */,
|
||||||
BF0FA70A2DDC69C800C9E5F2 /* VPTableViewCell.swift in Sources */,
|
BF0FA70A2DDC69C800C9E5F2 /* VPTableViewCell.swift in Sources */,
|
||||||
BFF5B2752DF2C3750044227A /* VPDetailRecommandView.swift in Sources */,
|
BFF5B2752DF2C3750044227A /* VPDetailRecommandView.swift in Sources */,
|
||||||
BF0FA7A12DE1AA5100C9E5F2 /* VPTableView.swift in Sources */,
|
BF0FA7A12DE1AA5100C9E5F2 /* VPTableView.swift in Sources */,
|
||||||
@ -1688,6 +1711,7 @@
|
|||||||
BF0FA7B62DE44E8000C9E5F2 /* VPWebView.swift in Sources */,
|
BF0FA7B62DE44E8000C9E5F2 /* VPWebView.swift in Sources */,
|
||||||
1B056E492DDAC3DF007EE38D /* VPAppTool.swift in Sources */,
|
1B056E492DDAC3DF007EE38D /* VPAppTool.swift in Sources */,
|
||||||
BFF5AFE62DEEDB7F0044227A /* VPRewardsViewController.swift in Sources */,
|
BFF5AFE62DEEDB7F0044227A /* VPRewardsViewController.swift in Sources */,
|
||||||
|
BFA21D9C2E01628F00B3573D /* VPStoreCoinsBuyView.swift in Sources */,
|
||||||
BF0FA74E2DDF067E00C9E5F2 /* VPVideoPlayViewModel.swift in Sources */,
|
BF0FA74E2DDF067E00C9E5F2 /* VPVideoPlayViewModel.swift in Sources */,
|
||||||
BFF5B24A2DF0524D0044227A /* AppDelegate+Open.swift in Sources */,
|
BFF5B24A2DF0524D0044227A /* AppDelegate+Open.swift in Sources */,
|
||||||
BFF5B2412DF045BF0044227A /* VPRewardsAPI.swift in Sources */,
|
BFF5B2412DF045BF0044227A /* VPRewardsAPI.swift in Sources */,
|
||||||
@ -1763,7 +1787,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.2;
|
MARKETING_VERSION = 1.0.3;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.qjwl168.veloria.ios;
|
PRODUCT_BUNDLE_IDENTIFIER = com.qjwl168.veloria.ios;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
@ -1804,7 +1828,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.2;
|
MARKETING_VERSION = 1.0.3;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.qjwl168.veloria.ios;
|
PRODUCT_BUNDLE_IDENTIFIER = com.qjwl168.veloria.ios;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
|
@ -254,4 +254,83 @@ extension UIColor {
|
|||||||
return UIColor(rgb: 0xDBDBDB, alpha: alpha)
|
return UIColor(rgb: 0xDBDBDB, alpha: alpha)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static func color7869FF(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0x7869FF, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func color9F45FF(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0x9F45FF, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func colorBDFFFB(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0xBDFFFB, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func color7AD9D4(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0x7AD9D4, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func colorADCFFF(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0xADCFFF, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func color7CA1D7(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0x7CA1D7, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func colorDBC7FF(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0xDBC7FF, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func color975DFF(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0x975DFF, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func color16706A(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0x16706A, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func color214170(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0x214170, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func color510087(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0x510087, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func color683D00(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0x683D00, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func color5F1EB9(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0x5F1EB9, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func colorCABCFF(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0xCABCFF, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func color8790B7(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0x8790B7, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func color8AAEA6(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0x8AAEA6, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func colorA395D9(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0xA395D9, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func colorAC978D(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0xAC978D, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func colorFFC779(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0xFFC779, alpha: alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func colorFF9500(alpha: CGFloat = 1) -> UIColor {
|
||||||
|
return UIColor(rgb: 0xFF9500, alpha: alpha)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ extension VPMeToolCell {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@objc private func handleStoreButton() {
|
@objc private func handleStoreButton() {
|
||||||
let vc = VPVipPageViewController()
|
let vc = VPStoreViewController()
|
||||||
self.viewController?.navigationController?.pushViewController(vc, animated: true)
|
self.viewController?.navigationController?.pushViewController(vc, animated: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ class VPMeVipCell: VPTableViewCell {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@objc private func handleBgView() {
|
@objc private func handleBgView() {
|
||||||
let vc = VPVipPageViewController()
|
let vc = VPStoreViewController()
|
||||||
self.viewController?.navigationController?.pushViewController(vc, animated: true)
|
self.viewController?.navigationController?.pushViewController(vc, animated: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,13 +12,13 @@ class VPPlayerRechargeView: HWPanModalContentView {
|
|||||||
var shortPlayId: String? {
|
var shortPlayId: String? {
|
||||||
didSet {
|
didSet {
|
||||||
vipView.shortPlayId = shortPlayId
|
vipView.shortPlayId = shortPlayId
|
||||||
coinView.shortPlayId = shortPlayId
|
coinsView.shortPlayId = shortPlayId
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var videoId: String? {
|
var videoId: String? {
|
||||||
didSet {
|
didSet {
|
||||||
vipView.videoId = videoId
|
vipView.videoId = videoId
|
||||||
coinView.videoId = videoId
|
coinsView.videoId = videoId
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,13 +56,13 @@ class VPPlayerRechargeView: HWPanModalContentView {
|
|||||||
private lazy var stackView: UIStackView = {
|
private lazy var stackView: UIStackView = {
|
||||||
let view = UIStackView()
|
let view = UIStackView()
|
||||||
view.axis = .vertical
|
view.axis = .vertical
|
||||||
view.spacing = 0
|
view.spacing = 12
|
||||||
view.alignment = .center
|
|
||||||
return view
|
return view
|
||||||
}()
|
}()
|
||||||
|
|
||||||
private lazy var vipView: VPPlayerVipBuyView = {
|
|
||||||
let view = VPPlayerVipBuyView()
|
private lazy var vipView: VPStoreVipBuyView = {
|
||||||
|
let view = VPStoreVipBuyView()
|
||||||
view.buyFinishBlock = { [weak self] in
|
view.buyFinishBlock = { [weak self] in
|
||||||
self?.buyFinishBlock?()
|
self?.buyFinishBlock?()
|
||||||
self?.dismiss(animated: true) {
|
self?.dismiss(animated: true) {
|
||||||
@ -71,8 +71,8 @@ class VPPlayerRechargeView: HWPanModalContentView {
|
|||||||
return view
|
return view
|
||||||
}()
|
}()
|
||||||
|
|
||||||
private lazy var coinView: VPPlayerCoinBuyView = {
|
private lazy var coinsView: VPStoreCoinsBuyView = {
|
||||||
let view = VPPlayerCoinBuyView()
|
let view = VPStoreCoinsBuyView()
|
||||||
view.buyFinishBlock = { [weak self] in
|
view.buyFinishBlock = { [weak self] in
|
||||||
self?.buyFinishBlock?()
|
self?.buyFinishBlock?()
|
||||||
self?.dismiss(animated: true) {
|
self?.dismiss(animated: true) {
|
||||||
@ -81,6 +81,38 @@ class VPPlayerRechargeView: HWPanModalContentView {
|
|||||||
return view
|
return view
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
// private lazy var vipView: VPPlayerVipBuyView = {
|
||||||
|
// let view = VPPlayerVipBuyView()
|
||||||
|
// view.buyFinishBlock = { [weak self] in
|
||||||
|
// self?.buyFinishBlock?()
|
||||||
|
// self?.dismiss(animated: true) {
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return view
|
||||||
|
// }()
|
||||||
|
//
|
||||||
|
// private lazy var coinView: VPPlayerCoinBuyView = {
|
||||||
|
// let view = VPPlayerCoinBuyView()
|
||||||
|
// view.buyFinishBlock = { [weak self] in
|
||||||
|
// self?.buyFinishBlock?()
|
||||||
|
// self?.dismiss(animated: true) {
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return view
|
||||||
|
// }()
|
||||||
|
|
||||||
|
private lazy var tipView: UIView = {
|
||||||
|
let view = UIView()
|
||||||
|
view.addSubview(tipLabel)
|
||||||
|
tipLabel.snp.makeConstraints { make in
|
||||||
|
make.left.equalToSuperview().offset(15)
|
||||||
|
make.right.lessThanOrEqualToSuperview().offset(-15)
|
||||||
|
make.top.bottom.equalToSuperview()
|
||||||
|
}
|
||||||
|
|
||||||
|
return view
|
||||||
|
}()
|
||||||
|
|
||||||
private lazy var tipLabel: UILabel = {
|
private lazy var tipLabel: UILabel = {
|
||||||
let label = UILabel()
|
let label = UILabel()
|
||||||
label.numberOfLines = 0
|
label.numberOfLines = 0
|
||||||
@ -126,7 +158,8 @@ class VPPlayerRechargeView: HWPanModalContentView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override func longFormHeight() -> PanModalHeight {
|
override func longFormHeight() -> PanModalHeight {
|
||||||
return PanModalHeightMake(.content, UIScreen.height * (2 / 3))
|
// return PanModalHeightMake(.content, UIScreen.height * (4 / 5))
|
||||||
|
return PanModalHeightMake(.content, UIScreen.height - UIScreen.navBarHeight - 20)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func showDragIndicator() -> Bool {
|
override func showDragIndicator() -> Bool {
|
||||||
@ -211,12 +244,12 @@ extension VPPlayerRechargeView {
|
|||||||
|
|
||||||
coinIconImageView.snp.makeConstraints { make in
|
coinIconImageView.snp.makeConstraints { make in
|
||||||
make.left.equalTo(coinLabel.snp.right).offset(3)
|
make.left.equalTo(coinLabel.snp.right).offset(3)
|
||||||
make.top.equalToSuperview().offset(40)
|
make.centerY.equalTo(closeButton)
|
||||||
}
|
}
|
||||||
|
|
||||||
scrollView.snp.makeConstraints { make in
|
scrollView.snp.makeConstraints { make in
|
||||||
make.left.right.equalToSuperview()
|
make.left.right.equalToSuperview()
|
||||||
make.top.equalToSuperview().offset(56)
|
make.top.equalToSuperview().offset(41)
|
||||||
make.bottom.equalToSuperview()
|
make.bottom.equalToSuperview()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,24 +272,35 @@ extension VPPlayerRechargeView {
|
|||||||
stackView.removeAllArrangedSubview()
|
stackView.removeAllArrangedSubview()
|
||||||
|
|
||||||
if let model = model {
|
if let model = model {
|
||||||
self.vipView.dataArr = model.list_sub_vip ?? []
|
|
||||||
self.coinView.dataArr = model.list_coins ?? []
|
|
||||||
|
|
||||||
if self.vipView.dataArr.count > 0 {
|
if let list = model.list_sub_vip, list.count > 0 {
|
||||||
self.stackView.addArrangedSubview(self.vipView)
|
self.stackView.addArrangedSubview(self.vipView)
|
||||||
|
self.vipView.dataArr = list
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.coinView.dataArr.count > 0 {
|
if let list = model.list_coins, list.count > 0 {
|
||||||
self.stackView.addArrangedSubview(self.coinView)
|
self.stackView.addArrangedSubview(self.coinsView)
|
||||||
|
self.coinsView.dataArr = list
|
||||||
}
|
}
|
||||||
|
|
||||||
if let view = self.stackView.arrangedSubviews.last {
|
if self.stackView.arrangedSubviews.count == 1,
|
||||||
self.stackView.setCustomSpacing(12, after: view)
|
let view = self.stackView.arrangedSubviews.first,
|
||||||
|
view == self.coinsView {
|
||||||
|
scrollView.snp.updateConstraints { make in
|
||||||
|
make.top.equalToSuperview().offset(56)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
scrollView.snp.updateConstraints { make in
|
||||||
|
make.top.equalToSuperview().offset(41)
|
||||||
}
|
}
|
||||||
self.stackView.addArrangedSubview(tipLabel)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.panModalSetNeedsLayoutUpdate()
|
|
||||||
|
self.stackView.addArrangedSubview(tipView)
|
||||||
|
}
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
|
||||||
|
self?.panModalSetNeedsLayoutUpdate()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -209,10 +209,10 @@ extension VPPlayerVipBuyView: ZKCycleScrollViewDelegate, ZKCycleScrollViewDataSo
|
|||||||
cycleScrollView.reloadData()
|
cycleScrollView.reloadData()
|
||||||
}
|
}
|
||||||
|
|
||||||
VPIAPManager.manager.start(model: dataArr[index]) { finish in
|
VPIAPManager.manager.start(model: dataArr[index]) { [weak self] finish in
|
||||||
if finish {
|
if finish {
|
||||||
VPLoginManager.manager.updateUserInfo(completer: nil)
|
VPLoginManager.manager.updateUserInfo(completer: nil)
|
||||||
self.buyFinishBlock?()
|
self?.buyFinishBlock?()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
130
Veloria/Class/Wallet/Controller/VPStoreViewController.swift
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
//
|
||||||
|
// VPStoreViewController.swift
|
||||||
|
// Veloria
|
||||||
|
//
|
||||||
|
// Created by 湖南秦九 on 2025/6/17.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
class VPStoreViewController: VPViewController {
|
||||||
|
|
||||||
|
private lazy var scrollView: VPScrollView = {
|
||||||
|
let scrollView = VPScrollView()
|
||||||
|
return scrollView
|
||||||
|
}()
|
||||||
|
|
||||||
|
private lazy var stackView: UIStackView = {
|
||||||
|
let view = UIStackView()
|
||||||
|
view.spacing = 12
|
||||||
|
view.axis = .vertical
|
||||||
|
return view
|
||||||
|
}()
|
||||||
|
|
||||||
|
private lazy var vipView: VPStoreVipBuyView = {
|
||||||
|
let view = VPStoreVipBuyView()
|
||||||
|
return view
|
||||||
|
}()
|
||||||
|
|
||||||
|
private lazy var coinsView: VPStoreCoinsBuyView = {
|
||||||
|
let view = VPStoreCoinsBuyView()
|
||||||
|
return view
|
||||||
|
}()
|
||||||
|
|
||||||
|
private lazy var tipView: UIView = {
|
||||||
|
let view = UIView()
|
||||||
|
view.addSubview(tipLabel)
|
||||||
|
tipLabel.snp.makeConstraints { make in
|
||||||
|
make.left.equalToSuperview().offset(15)
|
||||||
|
make.right.lessThanOrEqualToSuperview().offset(-15)
|
||||||
|
make.top.bottom.equalToSuperview()
|
||||||
|
}
|
||||||
|
|
||||||
|
return view
|
||||||
|
}()
|
||||||
|
|
||||||
|
private lazy var tipLabel: UILabel = {
|
||||||
|
let label = UILabel()
|
||||||
|
label.textColor = .colorFFFFFF(alpha: 0.5)
|
||||||
|
label.font = .fontRegular(ofSize: 12)
|
||||||
|
label.numberOfLines = 0
|
||||||
|
label.text = "veloria_store_tips_ios".localized
|
||||||
|
return label
|
||||||
|
}()
|
||||||
|
|
||||||
|
override func viewDidLoad() {
|
||||||
|
super.viewDidLoad()
|
||||||
|
self.title = "veloria_store".localized
|
||||||
|
|
||||||
|
let rightBar = UIBarButtonItem(title: "Restore".localized, style: .plain, target: self, action: #selector(handleRestore))
|
||||||
|
self.navigationItem.rightBarButtonItem = rightBar
|
||||||
|
|
||||||
|
|
||||||
|
vp_setupUI()
|
||||||
|
requestData()
|
||||||
|
|
||||||
|
self.stackView.addArrangedSubview(self.tipView)
|
||||||
|
}
|
||||||
|
|
||||||
|
override func viewWillAppear(_ animated: Bool) {
|
||||||
|
super.viewWillAppear(animated)
|
||||||
|
self.navigationController?.setNavigationBarHidden(false, animated: true)
|
||||||
|
self.setNavigationNormalStyle()
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc private func handleRestore() {
|
||||||
|
VPIAPManager.manager.restore(isLoding: true) { isFinish in
|
||||||
|
if isFinish {
|
||||||
|
VPLoginManager.manager.updateUserInfo(completer: nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension VPStoreViewController {
|
||||||
|
|
||||||
|
private func vp_setupUI() {
|
||||||
|
view.addSubview(scrollView)
|
||||||
|
scrollView.addSubview(stackView)
|
||||||
|
|
||||||
|
scrollView.snp.makeConstraints { make in
|
||||||
|
make.left.right.bottom.equalToSuperview()
|
||||||
|
make.top.equalToSuperview().offset(UIScreen.navBarHeight)
|
||||||
|
}
|
||||||
|
|
||||||
|
stackView.snp.makeConstraints { make in
|
||||||
|
make.left.centerX.equalToSuperview()
|
||||||
|
make.top.equalToSuperview()
|
||||||
|
make.bottom.equalToSuperview().offset(-(UIScreen.tabbarSafeBottomMargin + 15))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
extension VPStoreViewController {
|
||||||
|
|
||||||
|
private func requestData() {
|
||||||
|
|
||||||
|
VPWalletAPI.requestPayTemplate { [weak self] model in
|
||||||
|
guard let self = self else { return }
|
||||||
|
if let model = model {
|
||||||
|
self.stackView.removeAllArrangedSubview()
|
||||||
|
|
||||||
|
if let list = model.list_sub_vip, list.count > 0 {
|
||||||
|
self.stackView.addArrangedSubview(self.vipView)
|
||||||
|
self.vipView.dataArr = list
|
||||||
|
}
|
||||||
|
|
||||||
|
if let list = model.list_coins, list.count > 0 {
|
||||||
|
self.stackView.addArrangedSubview(self.coinsView)
|
||||||
|
self.coinsView.dataArr = list
|
||||||
|
}
|
||||||
|
|
||||||
|
self.stackView.addArrangedSubview(self.tipView)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -33,6 +33,11 @@ class VPPayTemplateItem: VPModel, SmartCodable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum SizeType: String, SmartCaseDefaultable {
|
||||||
|
case big = "big"
|
||||||
|
case small = "small"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
var id: String?
|
var id: String?
|
||||||
var status: String?
|
var status: String?
|
||||||
@ -54,6 +59,8 @@ class VPPayTemplateItem: VPModel, SmartCodable {
|
|||||||
|
|
||||||
var send_coin_ttl: Int?
|
var send_coin_ttl: Int?
|
||||||
|
|
||||||
|
var size: SizeType?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var ios_template_id: String?
|
var ios_template_id: String?
|
||||||
|
55
Veloria/Class/Wallet/View/VPStoreCoinsBigItemView.swift
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
//
|
||||||
|
// VPStoreCoinsBigItemView.swift
|
||||||
|
// Veloria
|
||||||
|
//
|
||||||
|
// Created by 湖南秦九 on 2025/6/17.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
class VPStoreCoinsBigItemView: VPStoreCoinsItemView {
|
||||||
|
|
||||||
|
override var intrinsicContentSize: CGSize {
|
||||||
|
let width = floor((UIScreen.width - 30 - 10) / 2)
|
||||||
|
return .init(width: width, height: 108)
|
||||||
|
}
|
||||||
|
|
||||||
|
override var item: VPPayTemplateItem? {
|
||||||
|
didSet {
|
||||||
|
if let mark = item?.corner_marker, !mark.isEmpty {
|
||||||
|
hotImageView.isHidden = false
|
||||||
|
} else {
|
||||||
|
hotImageView.isHidden = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private lazy var hotImageView: UIImageView = {
|
||||||
|
let imageView = UIImageView(image: UIImage(named: "hot_icon_04"))
|
||||||
|
return imageView
|
||||||
|
}()
|
||||||
|
|
||||||
|
override init(frame: CGRect) {
|
||||||
|
super.init(frame: frame)
|
||||||
|
bgView.image = UIImage(named: "coin_big_bg_image")
|
||||||
|
|
||||||
|
bonusLabel.textColor = .colorFFC779()
|
||||||
|
bottomView.colors = [UIColor.colorFBF2C7(alpha: 0.9).cgColor, UIColor.colorA87A46(alpha: 0.9).cgColor]
|
||||||
|
priceLabel.font = .fontMedium(ofSize: 14)
|
||||||
|
priceLabel.textColor = .color683D00()
|
||||||
|
bonusRatioView.backgroundColor = .colorFF9500()
|
||||||
|
selectedImageView.image = UIImage(named: "selected_icon_02")
|
||||||
|
|
||||||
|
|
||||||
|
bgView.addSubview(hotImageView)
|
||||||
|
|
||||||
|
hotImageView.snp.makeConstraints { make in
|
||||||
|
make.left.equalToSuperview().offset(4)
|
||||||
|
make.top.equalToSuperview().offset(3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@MainActor required init?(coder: NSCoder) {
|
||||||
|
fatalError("init(coder:) has not been implemented")
|
||||||
|
}
|
||||||
|
}
|
258
Veloria/Class/Wallet/View/VPStoreCoinsBuyView.swift
Normal file
@ -0,0 +1,258 @@
|
|||||||
|
//
|
||||||
|
// VPStoreCoinsBuyView.swift
|
||||||
|
// Veloria
|
||||||
|
//
|
||||||
|
// Created by 湖南秦九 on 2025/6/17.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
class VPStoreCoinsBuyView: UIView {
|
||||||
|
|
||||||
|
var buyFinishBlock: (() -> Void)?
|
||||||
|
|
||||||
|
var shortPlayId: String?
|
||||||
|
var videoId: String?
|
||||||
|
|
||||||
|
var dataArr: [VPPayTemplateItem] = [] {
|
||||||
|
didSet {
|
||||||
|
selectedItem = nil
|
||||||
|
|
||||||
|
bigDataArr.removeAll()
|
||||||
|
smallDataArr.removeAll()
|
||||||
|
|
||||||
|
|
||||||
|
dataArr.forEach {
|
||||||
|
if $0.size == .big {
|
||||||
|
bigDataArr.append($0)
|
||||||
|
} else {
|
||||||
|
smallDataArr.append($0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CATransaction.setCompletionBlock { [weak self] in
|
||||||
|
guard let self = self else { return }
|
||||||
|
self.updateLayout()
|
||||||
|
}
|
||||||
|
CATransaction.begin()
|
||||||
|
self.reloadData()
|
||||||
|
CATransaction.commit()
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private lazy var bigDataArr: [VPPayTemplateItem] = []
|
||||||
|
private lazy var smallDataArr: [VPPayTemplateItem] = []
|
||||||
|
|
||||||
|
|
||||||
|
private var selectedItem: VPPayTemplateItem?
|
||||||
|
|
||||||
|
|
||||||
|
private lazy var bigCollectionViewLayout: UICollectionViewFlowLayout = {
|
||||||
|
let width = floor((UIScreen.width - 30 - 10) / 2)
|
||||||
|
let layout = UICollectionViewFlowLayout()
|
||||||
|
layout.itemSize = .init(width: width, height: 108)
|
||||||
|
layout.minimumInteritemSpacing = 10
|
||||||
|
layout.minimumLineSpacing = 10
|
||||||
|
layout.sectionInset = .init(top: 0, left: 15, bottom: 0, right: 15)
|
||||||
|
return layout
|
||||||
|
}()
|
||||||
|
|
||||||
|
private lazy var smallCollectionViewLayout: UICollectionViewFlowLayout = {
|
||||||
|
let width = floor((UIScreen.width - 30 - 20) / 3)
|
||||||
|
let layout = UICollectionViewFlowLayout()
|
||||||
|
layout.itemSize = .init(width: width, height: 108)
|
||||||
|
layout.minimumInteritemSpacing = 10
|
||||||
|
layout.minimumLineSpacing = 10
|
||||||
|
layout.sectionInset = .init(top: 0, left: 15, bottom: 0, right: 15)
|
||||||
|
return layout
|
||||||
|
}()
|
||||||
|
|
||||||
|
private lazy var bigCollectionView: VPCollectionView = {
|
||||||
|
let collectionView = VPCollectionView(frame: .zero, collectionViewLayout: bigCollectionViewLayout)
|
||||||
|
collectionView.delegate = self
|
||||||
|
collectionView.dataSource = self
|
||||||
|
collectionView.isScrollEnabled = false
|
||||||
|
collectionView.register(VPStoreCoinsBigItemView.self, forCellWithReuseIdentifier: "cell")
|
||||||
|
|
||||||
|
return collectionView
|
||||||
|
}()
|
||||||
|
|
||||||
|
private lazy var smallCollectionView: VPCollectionView = {
|
||||||
|
let collectionView = VPCollectionView(frame: .zero, collectionViewLayout: smallCollectionViewLayout)
|
||||||
|
collectionView.delegate = self
|
||||||
|
collectionView.dataSource = self
|
||||||
|
collectionView.isScrollEnabled = false
|
||||||
|
collectionView.register(VPStoreCoinsSmallItemView.self, forCellWithReuseIdentifier: "cell")
|
||||||
|
return collectionView
|
||||||
|
}()
|
||||||
|
|
||||||
|
private lazy var bigStackView: UIStackView = {
|
||||||
|
let view = UIStackView()
|
||||||
|
view.axis = .horizontal
|
||||||
|
view.spacing = 10
|
||||||
|
return view
|
||||||
|
}()
|
||||||
|
|
||||||
|
private lazy var smallStackView: UIStackView = {
|
||||||
|
let view = UIStackView()
|
||||||
|
view.axis = .horizontal
|
||||||
|
view.spacing = 10
|
||||||
|
return view
|
||||||
|
}()
|
||||||
|
|
||||||
|
|
||||||
|
private lazy var titleLabel: UILabel = {
|
||||||
|
let label = UILabel()
|
||||||
|
label.font = .fontMedium(ofSize: 13)
|
||||||
|
label.textColor = .colorFFFFFF()
|
||||||
|
label.text = "veloria_coin_buy_title".localized
|
||||||
|
return label
|
||||||
|
}()
|
||||||
|
|
||||||
|
override init(frame: CGRect) {
|
||||||
|
super.init(frame: frame)
|
||||||
|
|
||||||
|
vp_setupUI()
|
||||||
|
|
||||||
|
updateLayout()
|
||||||
|
}
|
||||||
|
|
||||||
|
required init?(coder: NSCoder) {
|
||||||
|
fatalError("init(coder:) has not been implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
private func reloadData() {
|
||||||
|
self.bigCollectionView.reloadData()
|
||||||
|
self.smallCollectionView.reloadData()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
extension VPStoreCoinsBuyView {
|
||||||
|
|
||||||
|
private func vp_setupUI() {
|
||||||
|
addSubview(titleLabel)
|
||||||
|
addSubview(bigCollectionView)
|
||||||
|
addSubview(smallCollectionView)
|
||||||
|
|
||||||
|
titleLabel.snp.makeConstraints { make in
|
||||||
|
make.left.equalToSuperview().offset(15)
|
||||||
|
make.top.equalToSuperview()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func updateLayout() {
|
||||||
|
let top = 25.0
|
||||||
|
let bigHeight = bigCollectionView.contentSize.height + 1
|
||||||
|
let smallHeight = smallCollectionView.contentSize.height + 1
|
||||||
|
|
||||||
|
if bigDataArr.count > 0 && smallDataArr.count > 0 {
|
||||||
|
bigCollectionView.snp.remakeConstraints { make in
|
||||||
|
make.top.equalToSuperview().offset(top)
|
||||||
|
make.left.right.equalToSuperview()
|
||||||
|
make.height.equalTo(bigHeight)
|
||||||
|
}
|
||||||
|
|
||||||
|
smallCollectionView.snp.remakeConstraints { make in
|
||||||
|
make.left.right.equalToSuperview()
|
||||||
|
make.bottom.equalToSuperview()
|
||||||
|
make.top.equalTo(bigCollectionView.snp.bottom).offset(10)
|
||||||
|
make.height.equalTo(smallHeight)
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if bigDataArr.count > 0 {
|
||||||
|
bigCollectionView.snp.remakeConstraints { make in
|
||||||
|
make.top.equalToSuperview().offset(top)
|
||||||
|
make.left.right.equalToSuperview()
|
||||||
|
make.height.equalTo(bigHeight)
|
||||||
|
make.bottom.equalToSuperview()
|
||||||
|
}
|
||||||
|
|
||||||
|
smallCollectionView.snp.remakeConstraints { make in
|
||||||
|
make.left.right.equalToSuperview()
|
||||||
|
make.top.equalTo(bigCollectionView.snp.bottom).offset(10)
|
||||||
|
make.height.equalTo(smallHeight)
|
||||||
|
}
|
||||||
|
} else if smallDataArr.count > 0 {
|
||||||
|
|
||||||
|
smallCollectionView.snp.remakeConstraints { make in
|
||||||
|
make.top.equalToSuperview().offset(top)
|
||||||
|
make.left.right.equalToSuperview()
|
||||||
|
make.height.equalTo(smallHeight)
|
||||||
|
make.bottom.equalToSuperview()
|
||||||
|
}
|
||||||
|
|
||||||
|
bigCollectionView.snp.remakeConstraints { make in
|
||||||
|
make.left.right.equalToSuperview()
|
||||||
|
make.top.equalTo(smallCollectionView.snp.bottom).offset(10)
|
||||||
|
make.height.equalTo(bigHeight)
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
bigCollectionView.snp.remakeConstraints { make in
|
||||||
|
make.top.equalToSuperview().offset(top)
|
||||||
|
make.left.right.equalToSuperview()
|
||||||
|
make.height.equalTo(bigHeight)
|
||||||
|
}
|
||||||
|
|
||||||
|
smallCollectionView.snp.remakeConstraints { make in
|
||||||
|
make.left.right.equalToSuperview()
|
||||||
|
make.bottom.equalToSuperview()
|
||||||
|
make.top.equalTo(bigCollectionView.snp.bottom).offset(10)
|
||||||
|
make.height.equalTo(smallHeight)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//MARK: -------------- UICollectionViewDelegate UICollectionViewDataSource --------------
|
||||||
|
extension VPStoreCoinsBuyView: UICollectionViewDelegate, UICollectionViewDataSource {
|
||||||
|
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
|
||||||
|
let item: VPPayTemplateItem
|
||||||
|
if collectionView == self.bigCollectionView {
|
||||||
|
item = self.bigDataArr[indexPath.row]
|
||||||
|
} else {
|
||||||
|
item = self.smallDataArr[indexPath.row]
|
||||||
|
}
|
||||||
|
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! VPStoreCoinsItemView
|
||||||
|
cell.item = item
|
||||||
|
cell.vp_isSelected = item == selectedItem
|
||||||
|
return cell
|
||||||
|
}
|
||||||
|
|
||||||
|
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
||||||
|
if collectionView == self.bigCollectionView {
|
||||||
|
return self.bigDataArr.count
|
||||||
|
} else {
|
||||||
|
return self.smallDataArr.count
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
|
||||||
|
let item: VPPayTemplateItem
|
||||||
|
if collectionView == self.bigCollectionView {
|
||||||
|
item = self.bigDataArr[indexPath.row]
|
||||||
|
} else {
|
||||||
|
item = self.smallDataArr[indexPath.row]
|
||||||
|
}
|
||||||
|
|
||||||
|
if selectedItem != item {
|
||||||
|
selectedItem = item
|
||||||
|
self.reloadData()
|
||||||
|
}
|
||||||
|
|
||||||
|
VPIAPManager.manager.start(model: item, shortPlayId: shortPlayId, videoId: videoId) { [weak self] finish in
|
||||||
|
if finish {
|
||||||
|
VPLoginManager.manager.updateUserInfo(completer: nil)
|
||||||
|
self?.buyFinishBlock?()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
170
Veloria/Class/Wallet/View/VPStoreCoinsItemView.swift
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
//
|
||||||
|
// VPStoreCoinsItemView.swift
|
||||||
|
// Veloria
|
||||||
|
//
|
||||||
|
// Created by 湖南秦九 on 2025/6/17.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
class VPStoreCoinsItemView: VPCollectionViewCell {
|
||||||
|
|
||||||
|
var item: VPPayTemplateItem? {
|
||||||
|
didSet {
|
||||||
|
coinView.setTitle("\(item?.coins ?? 0)", for: .normal)
|
||||||
|
|
||||||
|
priceLabel.text = "\(item?.currency ?? "")\(item?.price ?? "")"
|
||||||
|
|
||||||
|
if let sendCoins = item?.send_coins, sendCoins > 0, let coins = item?.coins {
|
||||||
|
bonusLabel.isHidden = false
|
||||||
|
bonusRatioView.isHidden = false
|
||||||
|
bonusLabel.text = "veloria_bonus_count_text".localizedReplace(text: "\(sendCoins)")
|
||||||
|
|
||||||
|
let percent = CGFloat(sendCoins) / CGFloat(coins) * 100
|
||||||
|
bonusRatioLabel.text = String(format: "+%.0f%%", percent)
|
||||||
|
} else {
|
||||||
|
bonusLabel.isHidden = true
|
||||||
|
bonusRatioView.isHidden = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var vp_isSelected: Bool = false {
|
||||||
|
didSet {
|
||||||
|
selectedImageView.isHidden = !vp_isSelected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private(set) lazy var bgView: UIImageView = {
|
||||||
|
let imageView = UIImageView()
|
||||||
|
return imageView
|
||||||
|
}()
|
||||||
|
|
||||||
|
private(set) lazy var coinView: UIButton = {
|
||||||
|
let view = JXButton(type: .custom)
|
||||||
|
view.isUserInteractionEnabled = false
|
||||||
|
view.jx_font = .fontMedium(ofSize: 16)
|
||||||
|
view.titleDirection = .left
|
||||||
|
view.space = 3
|
||||||
|
view.setImage(UIImage(named: "coin_icon_04"), for: .normal)
|
||||||
|
view.setTitleColor(.colorFFFFFF(), for: .normal)
|
||||||
|
return view
|
||||||
|
}()
|
||||||
|
|
||||||
|
private(set) lazy var bonusLabel: UILabel = {
|
||||||
|
let label = UILabel()
|
||||||
|
label.font = .fontRegular(ofSize: 12)
|
||||||
|
return label
|
||||||
|
}()
|
||||||
|
|
||||||
|
private(set) lazy var bonusRatioView: UIView = {
|
||||||
|
let view = UIView()
|
||||||
|
view.addRadius(topLeft: 0, topRight: 8, bottomLeft: 8, bottomRight: 0)
|
||||||
|
return view
|
||||||
|
}()
|
||||||
|
|
||||||
|
private(set) lazy var bonusRatioLabel: UILabel = {
|
||||||
|
let label = UILabel()
|
||||||
|
label.font = .fontRegular(ofSize: 11)
|
||||||
|
label.textColor = .colorFFFFFF()
|
||||||
|
return label
|
||||||
|
}()
|
||||||
|
|
||||||
|
private(set) lazy var bottomView: VPGradientView = {
|
||||||
|
let view = VPGradientView()
|
||||||
|
view.locations = [0, 1]
|
||||||
|
view.startPoint = .init(x: 0, y: 0.5)
|
||||||
|
view.endPoint = .init(x: 1, y: 0.5)
|
||||||
|
view.addRadius(topLeft: 0, topRight: 0, bottomLeft: 8, bottomRight: 8)
|
||||||
|
return view
|
||||||
|
}()
|
||||||
|
|
||||||
|
private(set) lazy var priceLabel: UILabel = {
|
||||||
|
let label = UILabel()
|
||||||
|
return label
|
||||||
|
}()
|
||||||
|
|
||||||
|
private(set) lazy var selectedImageView: UIImageView = {
|
||||||
|
let imageView = UIImageView()
|
||||||
|
return imageView
|
||||||
|
}()
|
||||||
|
|
||||||
|
override init(frame: CGRect) {
|
||||||
|
super.init(frame: frame)
|
||||||
|
|
||||||
|
vp_setupUI()
|
||||||
|
}
|
||||||
|
|
||||||
|
required init?(coder: NSCoder) {
|
||||||
|
fatalError("init(coder:) has not been implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func vp_setupUI() {
|
||||||
|
addSubview(bgView)
|
||||||
|
bgView.addSubview(coinView)
|
||||||
|
bgView.addSubview(bonusLabel)
|
||||||
|
bgView.addSubview(bottomView)
|
||||||
|
bottomView.addSubview(priceLabel)
|
||||||
|
bgView.addSubview(bonusRatioView)
|
||||||
|
bonusRatioView.addSubview(bonusRatioLabel)
|
||||||
|
bgView.addSubview(selectedImageView)
|
||||||
|
|
||||||
|
bgView.snp.makeConstraints { make in
|
||||||
|
make.edges.equalToSuperview()
|
||||||
|
}
|
||||||
|
|
||||||
|
coinView.snp.makeConstraints { make in
|
||||||
|
make.centerX.equalToSuperview()
|
||||||
|
make.top.equalToSuperview().offset(28)
|
||||||
|
}
|
||||||
|
|
||||||
|
bonusLabel.snp.makeConstraints { make in
|
||||||
|
make.centerX.equalToSuperview()
|
||||||
|
make.top.equalToSuperview().offset(53)
|
||||||
|
}
|
||||||
|
|
||||||
|
bottomView.snp.makeConstraints { make in
|
||||||
|
make.left.right.bottom.equalToSuperview()
|
||||||
|
make.height.equalTo(28)
|
||||||
|
}
|
||||||
|
|
||||||
|
priceLabel.snp.makeConstraints { make in
|
||||||
|
make.center.equalToSuperview()
|
||||||
|
}
|
||||||
|
|
||||||
|
bonusRatioView.snp.makeConstraints { make in
|
||||||
|
make.right.top.equalToSuperview()
|
||||||
|
make.height.equalTo(16)
|
||||||
|
}
|
||||||
|
|
||||||
|
bonusRatioLabel.snp.makeConstraints { make in
|
||||||
|
make.center.equalToSuperview()
|
||||||
|
make.left.equalToSuperview().offset(5)
|
||||||
|
}
|
||||||
|
|
||||||
|
selectedImageView.snp.makeConstraints { make in
|
||||||
|
make.bottom.equalToSuperview()
|
||||||
|
make.right.equalToSuperview()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extension VPStoreCoinsItemView {
|
||||||
|
|
||||||
|
static func createView(item: VPPayTemplateItem) -> VPStoreCoinsItemView {
|
||||||
|
let view: VPStoreCoinsItemView
|
||||||
|
if item.size == .big {
|
||||||
|
view = VPStoreCoinsBigItemView()
|
||||||
|
} else {
|
||||||
|
view = VPStoreCoinsSmallItemView()
|
||||||
|
}
|
||||||
|
view.item = item
|
||||||
|
return view
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
73
Veloria/Class/Wallet/View/VPStoreCoinsSmallItemView.swift
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
//
|
||||||
|
// VPStoreCoinsSmallItemView.swift
|
||||||
|
// Veloria
|
||||||
|
//
|
||||||
|
// Created by 湖南秦九 on 2025/6/17.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
class VPStoreCoinsSmallItemView: VPStoreCoinsItemView {
|
||||||
|
|
||||||
|
override var intrinsicContentSize: CGSize {
|
||||||
|
let width = floor((UIScreen.width - 30 - 20) / 3)
|
||||||
|
return .init(width: width, height: 108)
|
||||||
|
}
|
||||||
|
|
||||||
|
override var item: VPPayTemplateItem? {
|
||||||
|
didSet {
|
||||||
|
if let mark = item?.corner_marker, !mark.isEmpty {
|
||||||
|
hotBgView.isHidden = false
|
||||||
|
hotLabel.text = mark
|
||||||
|
} else {
|
||||||
|
hotBgView.isHidden = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private lazy var hotBgView: UIView = {
|
||||||
|
let view = UIView()
|
||||||
|
view.backgroundColor = .colorBE0069()
|
||||||
|
view.addRadius(topLeft: 8, topRight: 0, bottomLeft: 0, bottomRight: 8)
|
||||||
|
view.layer.zPosition = 0
|
||||||
|
return view
|
||||||
|
}()
|
||||||
|
|
||||||
|
private lazy var hotLabel: UILabel = {
|
||||||
|
let label = UILabel()
|
||||||
|
label.textColor = .colorFFFFFF()
|
||||||
|
label.font = .fontRegular(ofSize: 11)
|
||||||
|
return label
|
||||||
|
}()
|
||||||
|
|
||||||
|
override init(frame: CGRect) {
|
||||||
|
super.init(frame: frame)
|
||||||
|
bgView.image = UIImage(named: "coin_small_bg_image")
|
||||||
|
|
||||||
|
bonusLabel.textColor = .color05CEA0()
|
||||||
|
bottomView.colors = [UIColor.color05CEA0(alpha: 0.25).cgColor, UIColor.color05CEA0(alpha: 0.25).cgColor]
|
||||||
|
priceLabel.font = .fontRegular(ofSize: 12)
|
||||||
|
priceLabel.textColor = .colorFFFFFF()
|
||||||
|
bonusRatioView.backgroundColor = .color05CEA0(alpha: 0.5)
|
||||||
|
selectedImageView.image = UIImage(named: "selected_icon_01")
|
||||||
|
|
||||||
|
bgView.addSubview(hotBgView)
|
||||||
|
hotBgView.addSubview(hotLabel)
|
||||||
|
|
||||||
|
hotBgView.snp.makeConstraints { make in
|
||||||
|
make.left.top.equalToSuperview()
|
||||||
|
make.height.equalTo(16)
|
||||||
|
}
|
||||||
|
|
||||||
|
hotLabel.snp.makeConstraints { make in
|
||||||
|
make.center.equalToSuperview()
|
||||||
|
make.left.equalToSuperview().offset(5)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@MainActor required init?(coder: NSCoder) {
|
||||||
|
fatalError("init(coder:) has not been implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
111
Veloria/Class/Wallet/View/VPStoreVipBuyView.swift
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
//
|
||||||
|
// VPStoreVipBuyView.swift
|
||||||
|
// Veloria
|
||||||
|
//
|
||||||
|
// Created by 湖南秦九 on 2025/6/17.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
class VPStoreVipBuyView: UIView {
|
||||||
|
|
||||||
|
override var intrinsicContentSize: CGSize {
|
||||||
|
var height: CGFloat = 1
|
||||||
|
|
||||||
|
if dataArr.count > 0, collectionView.contentSize.height > 0 {
|
||||||
|
height = collectionView.contentSize.height + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
return .init(width: UIScreen.width, height: height)
|
||||||
|
}
|
||||||
|
|
||||||
|
var buyFinishBlock: (() -> Void)?
|
||||||
|
|
||||||
|
var shortPlayId: String?
|
||||||
|
var videoId: String?
|
||||||
|
|
||||||
|
var dataArr: [VPPayTemplateItem] = [] {
|
||||||
|
didSet {
|
||||||
|
|
||||||
|
UIView.performWithoutAnimation { [weak self] in
|
||||||
|
self?.collectionView.reloadData()
|
||||||
|
}
|
||||||
|
self.collectionView.performBatchUpdates(nil) { [weak self] _ in
|
||||||
|
self?.invalidateIntrinsicContentSize()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private var currentIndex: Int?
|
||||||
|
|
||||||
|
private lazy var collectionViewLayout: UICollectionViewFlowLayout = {
|
||||||
|
let layout = UICollectionViewFlowLayout()
|
||||||
|
layout.itemSize = .init(width: UIScreen.width - 30, height: 130)
|
||||||
|
layout.minimumLineSpacing = 10
|
||||||
|
layout.minimumInteritemSpacing = 10
|
||||||
|
layout.sectionInset = .init(top: 0, left: 15, bottom: 0, right: 15)
|
||||||
|
return layout
|
||||||
|
}()
|
||||||
|
|
||||||
|
private lazy var collectionView: VPCollectionView = {
|
||||||
|
let collectionView = VPCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout)
|
||||||
|
collectionView.isScrollEnabled = false
|
||||||
|
collectionView.delegate = self
|
||||||
|
collectionView.dataSource = self
|
||||||
|
collectionView.register(VPVipBuyCell.self, forCellWithReuseIdentifier: "cell")
|
||||||
|
return collectionView
|
||||||
|
}()
|
||||||
|
|
||||||
|
override init(frame: CGRect) {
|
||||||
|
super.init(frame: frame)
|
||||||
|
vp_setupUI()
|
||||||
|
}
|
||||||
|
|
||||||
|
required init?(coder: NSCoder) {
|
||||||
|
fatalError("init(coder:) has not been implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
extension VPStoreVipBuyView {
|
||||||
|
|
||||||
|
private func vp_setupUI() {
|
||||||
|
addSubview(collectionView)
|
||||||
|
|
||||||
|
collectionView.snp.makeConstraints { make in
|
||||||
|
make.edges.equalToSuperview()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//MARK: -------------- UICollectionViewDelegate UICollectionViewDataSource --------------
|
||||||
|
extension VPStoreVipBuyView: UICollectionViewDelegate, UICollectionViewDataSource {
|
||||||
|
|
||||||
|
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
|
||||||
|
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! VPVipBuyCell
|
||||||
|
cell.item = dataArr[indexPath.row]
|
||||||
|
cell.vp_isSelected = indexPath.row == currentIndex
|
||||||
|
return cell
|
||||||
|
}
|
||||||
|
|
||||||
|
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
||||||
|
self.dataArr.count
|
||||||
|
}
|
||||||
|
|
||||||
|
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
|
||||||
|
if currentIndex != indexPath.row {
|
||||||
|
currentIndex = indexPath.row
|
||||||
|
collectionView.reloadData()
|
||||||
|
}
|
||||||
|
|
||||||
|
VPIAPManager.manager.start(model: dataArr[indexPath.row], shortPlayId: shortPlayId, videoId: videoId) { [weak self] finish in
|
||||||
|
if finish {
|
||||||
|
VPLoginManager.manager.updateUserInfo(completer: nil)
|
||||||
|
self?.buyFinishBlock?()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -14,42 +14,62 @@ class VPVipBuyCell: ZKCycleScrollViewCell {
|
|||||||
didSet {
|
didSet {
|
||||||
if let key = item?.vip_type_key?.rawValue {
|
if let key = item?.vip_type_key?.rawValue {
|
||||||
bgImageView.image = UIImage(named: "vip_buy_bg_\(key)")
|
bgImageView.image = UIImage(named: "vip_buy_bg_\(key)")
|
||||||
|
bgIconImageView.image = UIImage(named: "vip_buy_bg_icon_\(key)")
|
||||||
}
|
}
|
||||||
// vipNameLabel.text = item?.vip_type_key?.getText()
|
// vipNameLabel.text = item?.vip_type_key?.getText()
|
||||||
vipNameLabel.text = item?.title
|
vipNameLabel.text = item?.title
|
||||||
unitLabel.text = item?.currency
|
unitLabel.text = item?.currency
|
||||||
moneyLabel.text = item?.price
|
moneyLabel.text = item?.price
|
||||||
durationLabel.text = "/\(item?.vip_type_key?.getText() ?? "")"
|
durationLabel.text = "/\(item?.vip_type_key?.getText() ?? "")"
|
||||||
|
desLabel.text = item?.sp_description
|
||||||
|
|
||||||
|
|
||||||
|
var tipText = "veloria_store_auto_renew".localized
|
||||||
if let coin = item?.send_coins, coin > 0 {
|
if let coin = item?.send_coins, coin > 0 {
|
||||||
sendCoinBgView.isHidden = false
|
sendCoinBgView.isHidden = false
|
||||||
sendCoinView.isHidden = false
|
sendCoinView.isHidden = false
|
||||||
let text = "veloria_extra".localized + " \(coin)"
|
let text = "veloria_extra".localized + " \(coin)"
|
||||||
sendCoinView.setTitle("+" + text, for: .normal)
|
sendCoinView.setTitle("+" + text, for: .normal)
|
||||||
|
|
||||||
|
tipText += "\n"
|
||||||
|
tipText += "veloria_store_donate_coins_ios".localizedReplace(text: "veloria_days_count_text".localizedReplace(text: "\(item?.send_coin_ttl ?? 0)"))
|
||||||
} else {
|
} else {
|
||||||
sendCoinBgView.isHidden = true
|
sendCoinBgView.isHidden = true
|
||||||
sendCoinView.isHidden = true
|
sendCoinView.isHidden = true
|
||||||
}
|
}
|
||||||
|
tipLabel.text = tipText
|
||||||
|
|
||||||
var colors: [CGColor] = []
|
var colors: [CGColor] = []
|
||||||
|
|
||||||
switch item?.vip_type_key {
|
switch item?.vip_type_key {
|
||||||
case .week:
|
case .week:
|
||||||
colors = [UIColor.color64A3A7().cgColor, UIColor.color416767().cgColor]
|
colors = [UIColor.color64A3A7().cgColor, UIColor.color416767().cgColor]
|
||||||
sendCoinBgView.colors = [UIColor.colorB2E7EA().cgColor, UIColor.colorB2E7EA(alpha: 0).cgColor]
|
sendCoinBgView.colors = [UIColor.colorBDFFFB().cgColor, UIColor.color7AD9D4().cgColor]
|
||||||
sendCoinView.setTitleColor(.color416767(), for: .normal)
|
sendCoinView.setTitleColor(.color16706A(), for: .normal)
|
||||||
|
desLabel.textColor = .color416767()
|
||||||
|
desBgView.colors = [UIColor.colorB2E7EA().cgColor, UIColor.colorB2E7EA(alpha: 0).cgColor]
|
||||||
|
tipLabel.textColor = .color8AAEA6()
|
||||||
case .month:
|
case .month:
|
||||||
colors = [UIColor.color9C7565().cgColor, UIColor.color573D31().cgColor]
|
|
||||||
sendCoinBgView.colors = [UIColor.colorFFE6CE().cgColor, UIColor.colorFFE6CE(alpha: 0).cgColor]
|
|
||||||
sendCoinView.setTitleColor(.color573D31(), for: .normal)
|
|
||||||
case .quarter:
|
|
||||||
colors = [UIColor.color647DA7().cgColor, UIColor.color414867().cgColor]
|
colors = [UIColor.color647DA7().cgColor, UIColor.color414867().cgColor]
|
||||||
sendCoinBgView.colors = [UIColor.colorD6E5F9().cgColor, UIColor.colorD6E5F9(alpha: 0).cgColor]
|
sendCoinBgView.colors = [UIColor.colorADCFFF().cgColor, UIColor.color7CA1D7().cgColor]
|
||||||
sendCoinView.setTitleColor(.color303962(), for: .normal)
|
sendCoinView.setTitleColor(.color214170(), for: .normal)
|
||||||
|
desLabel.textColor = .color303962()
|
||||||
|
desBgView.colors = [UIColor.colorD6E5F9().cgColor, UIColor.colorD6E5F9(alpha: 0).cgColor]
|
||||||
|
tipLabel.textColor = .color8790B7()
|
||||||
|
case .quarter:
|
||||||
|
colors = [UIColor.color7869FF().cgColor, UIColor.color9F45FF().cgColor]
|
||||||
|
sendCoinBgView.colors = [UIColor.colorDBC7FF().cgColor, UIColor.color975DFF().cgColor]
|
||||||
|
sendCoinView.setTitleColor(.color510087(), for: .normal)
|
||||||
|
desLabel.textColor = .color5F1EB9()
|
||||||
|
desBgView.colors = [UIColor.colorCABCFF().cgColor, UIColor.colorCABCFF(alpha: 0).cgColor]
|
||||||
|
tipLabel.textColor = .colorA395D9()
|
||||||
case .year:
|
case .year:
|
||||||
colors = [UIColor.color9C6586().cgColor, UIColor.color57314F().cgColor]
|
colors = [UIColor.color9C7565().cgColor, UIColor.color573D31().cgColor]
|
||||||
sendCoinBgView.colors = [UIColor.colorFFD8F5().cgColor, UIColor.colorFFD8F5(alpha: 0).cgColor]
|
sendCoinBgView.colors = [UIColor.colorFBF2C7().cgColor, UIColor.colorA87A46().cgColor]
|
||||||
sendCoinView.setTitleColor(.color674162(), for: .normal)
|
sendCoinView.setTitleColor(.color683D00(), for: .normal)
|
||||||
|
desLabel.textColor = .color573D31()
|
||||||
|
desBgView.colors = [UIColor.colorFFE6CE().cgColor, UIColor.colorFFE6CE(alpha: 0).cgColor]
|
||||||
|
tipLabel.textColor = .colorAC978D()
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -59,7 +79,6 @@ class VPVipBuyCell: ZKCycleScrollViewCell {
|
|||||||
unitLabel.gradientLayer.colors = colors
|
unitLabel.gradientLayer.colors = colors
|
||||||
moneyLabel.gradientLayer.colors = colors
|
moneyLabel.gradientLayer.colors = colors
|
||||||
durationLabel.gradientLayer.colors = colors
|
durationLabel.gradientLayer.colors = colors
|
||||||
durationLabel.gradientLayer.colors = colors
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,27 +93,48 @@ class VPVipBuyCell: ZKCycleScrollViewCell {
|
|||||||
return imageView
|
return imageView
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
private lazy var bgIconImageView: UIImageView = {
|
||||||
|
let imageView = UIImageView()
|
||||||
|
return imageView
|
||||||
|
}()
|
||||||
|
|
||||||
private lazy var vipNameLabel: VPGradientLabel = {
|
private lazy var vipNameLabel: VPGradientLabel = {
|
||||||
let label = VPGradientLabel()
|
let label = VPGradientLabel()
|
||||||
label.font = .fontBold(ofSize: 16)
|
label.font = .fontMedium(ofSize: 12)
|
||||||
return label
|
return label
|
||||||
}()
|
}()
|
||||||
|
|
||||||
private lazy var unitLabel: VPGradientLabel = {
|
private lazy var unitLabel: VPGradientLabel = {
|
||||||
let label = VPGradientLabel()
|
let label = VPGradientLabel()
|
||||||
label.font = .fontRegular(ofSize: 14)
|
label.font = .fontRegular(ofSize: 18)
|
||||||
return label
|
return label
|
||||||
}()
|
}()
|
||||||
|
|
||||||
private lazy var moneyLabel: VPGradientLabel = {
|
private lazy var moneyLabel: VPGradientLabel = {
|
||||||
let label = VPGradientLabel()
|
let label = VPGradientLabel()
|
||||||
label.font = .fontAaHouDiHei(ofSize: 22)
|
label.font = .fontAaHouDiHei(ofSize: 32)
|
||||||
return label
|
return label
|
||||||
}()
|
}()
|
||||||
|
|
||||||
private lazy var durationLabel: VPGradientLabel = {
|
private lazy var durationLabel: VPGradientLabel = {
|
||||||
let label = VPGradientLabel()
|
let label = VPGradientLabel()
|
||||||
label.font = .fontRegular(ofSize: 14)
|
label.font = .fontMedium(ofSize: 16)
|
||||||
|
return label
|
||||||
|
}()
|
||||||
|
|
||||||
|
private lazy var desBgView: VPGradientView = {
|
||||||
|
let view = VPGradientView()
|
||||||
|
view.locations = [0, 1]
|
||||||
|
view.startPoint = .init(x: 0, y: 0.5)
|
||||||
|
view.endPoint = .init(x: 1, y: 0.5)
|
||||||
|
view.layer.cornerRadius = 8
|
||||||
|
view.layer.masksToBounds = true
|
||||||
|
return view
|
||||||
|
}()
|
||||||
|
|
||||||
|
private lazy var desLabel: UILabel = {
|
||||||
|
let label = UILabel()
|
||||||
|
label.font = .fontRegular(ofSize: 10)
|
||||||
return label
|
return label
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@ -103,8 +143,7 @@ class VPVipBuyCell: ZKCycleScrollViewCell {
|
|||||||
view.locations = [0, 1]
|
view.locations = [0, 1]
|
||||||
view.startPoint = .init(x: 0, y: 0.5)
|
view.startPoint = .init(x: 0, y: 0.5)
|
||||||
view.endPoint = .init(x: 1, y: 0.5)
|
view.endPoint = .init(x: 1, y: 0.5)
|
||||||
view.layer.cornerRadius = 6
|
view.addRadius(topLeft: 10, topRight: 0, bottomLeft: 0, bottomRight: 10)
|
||||||
view.layer.masksToBounds = true
|
|
||||||
return view
|
return view
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@ -113,11 +152,18 @@ class VPVipBuyCell: ZKCycleScrollViewCell {
|
|||||||
view.isUserInteractionEnabled = false
|
view.isUserInteractionEnabled = false
|
||||||
view.titleDirection = .left
|
view.titleDirection = .left
|
||||||
view.space = 4
|
view.space = 4
|
||||||
view.jx_font = .fontRegular(ofSize: 12)
|
view.jx_font = .fontMedium(ofSize: 12)
|
||||||
view.setImage(UIImage(named: "coin_icon_02"), for: .normal)
|
view.setImage(UIImage(named: "coin_icon_02"), for: .normal)
|
||||||
return view
|
return view
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
private lazy var tipLabel: UILabel = {
|
||||||
|
let label = UILabel()
|
||||||
|
label.numberOfLines = 0
|
||||||
|
label.font = .fontRegular(ofSize: 10)
|
||||||
|
return label
|
||||||
|
}()
|
||||||
|
|
||||||
private lazy var selectedImageView: UIImageView = {
|
private lazy var selectedImageView: UIImageView = {
|
||||||
let imageView = UIImageView(image: UIImage(named: "selected_icon_01"))
|
let imageView = UIImageView(image: UIImage(named: "selected_icon_01"))
|
||||||
return imageView
|
return imageView
|
||||||
@ -139,56 +185,81 @@ extension VPVipBuyCell {
|
|||||||
|
|
||||||
private func vp_setupUI() {
|
private func vp_setupUI() {
|
||||||
contentView.addSubview(bgImageView)
|
contentView.addSubview(bgImageView)
|
||||||
contentView.addSubview(vipNameLabel)
|
contentView.addSubview(bgIconImageView)
|
||||||
contentView.addSubview(unitLabel)
|
bgImageView.addSubview(vipNameLabel)
|
||||||
contentView.addSubview(moneyLabel)
|
bgImageView.addSubview(unitLabel)
|
||||||
contentView.addSubview(durationLabel)
|
bgImageView.addSubview(moneyLabel)
|
||||||
contentView.addSubview(sendCoinBgView)
|
bgImageView.addSubview(durationLabel)
|
||||||
contentView.addSubview(sendCoinView)
|
bgImageView.addSubview(sendCoinBgView)
|
||||||
contentView.addSubview(selectedImageView)
|
sendCoinBgView.addSubview(sendCoinView)
|
||||||
|
bgImageView.addSubview(desBgView)
|
||||||
|
desBgView.addSubview(desLabel)
|
||||||
|
bgImageView.addSubview(tipLabel)
|
||||||
|
bgImageView.addSubview(selectedImageView)
|
||||||
|
|
||||||
bgImageView.snp.makeConstraints { make in
|
bgImageView.snp.makeConstraints { make in
|
||||||
make.edges.equalToSuperview()
|
make.left.right.bottom.equalToSuperview()
|
||||||
|
make.top.equalToSuperview().offset(10)
|
||||||
|
}
|
||||||
|
|
||||||
|
bgIconImageView.snp.makeConstraints { make in
|
||||||
|
make.top.equalToSuperview()
|
||||||
|
make.right.equalToSuperview()
|
||||||
}
|
}
|
||||||
|
|
||||||
vipNameLabel.snp.makeConstraints { make in
|
vipNameLabel.snp.makeConstraints { make in
|
||||||
make.left.equalToSuperview().offset(14)
|
make.left.equalToSuperview().offset(20)
|
||||||
make.top.equalToSuperview().offset(35)
|
make.top.equalToSuperview().offset(10)
|
||||||
make.height.equalTo(22)
|
make.height.equalTo(22)
|
||||||
}
|
}
|
||||||
|
|
||||||
unitLabel.snp.makeConstraints { make in
|
unitLabel.snp.makeConstraints { make in
|
||||||
make.left.equalTo(vipNameLabel)
|
make.left.equalTo(vipNameLabel)
|
||||||
make.top.equalTo(vipNameLabel.snp.bottom).offset(17)
|
make.top.equalTo(vipNameLabel.snp.bottom).offset(10)
|
||||||
make.height.equalTo(20)
|
make.height.equalTo(25)
|
||||||
}
|
}
|
||||||
|
|
||||||
moneyLabel.snp.makeConstraints { make in
|
moneyLabel.snp.makeConstraints { make in
|
||||||
make.left.equalTo(unitLabel.snp.right)
|
make.left.equalTo(unitLabel.snp.right)
|
||||||
make.bottom.equalTo(unitLabel)
|
make.bottom.equalTo(unitLabel).offset(3)
|
||||||
}
|
}
|
||||||
|
|
||||||
durationLabel.snp.makeConstraints { make in
|
durationLabel.snp.makeConstraints { make in
|
||||||
make.bottom.equalTo(moneyLabel).offset(-2)
|
make.bottom.equalTo(unitLabel).offset(-2)
|
||||||
make.left.equalTo(moneyLabel.snp.right)
|
make.left.equalTo(moneyLabel.snp.right)
|
||||||
make.height.equalTo(20)
|
make.height.equalTo(22)
|
||||||
}
|
}
|
||||||
|
|
||||||
sendCoinBgView.snp.makeConstraints { make in
|
sendCoinBgView.snp.makeConstraints { make in
|
||||||
make.left.equalToSuperview().offset(14)
|
make.right.bottom.equalToSuperview()
|
||||||
make.bottom.equalToSuperview().offset(-10)
|
|
||||||
make.height.equalTo(24)
|
make.height.equalTo(24)
|
||||||
make.width.equalTo(105)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sendCoinView.snp.makeConstraints { make in
|
sendCoinView.snp.makeConstraints { make in
|
||||||
make.centerY.equalTo(sendCoinBgView)
|
make.centerY.equalToSuperview()
|
||||||
make.left.equalTo(sendCoinBgView).offset(11)
|
make.centerX.equalToSuperview()
|
||||||
|
make.left.equalToSuperview().offset(10)
|
||||||
|
}
|
||||||
|
|
||||||
|
desBgView.snp.makeConstraints { make in
|
||||||
|
make.left.equalToSuperview().offset(20)
|
||||||
|
make.bottom.equalToSuperview().offset(-35)
|
||||||
|
make.height.equalTo(16)
|
||||||
|
}
|
||||||
|
|
||||||
|
desLabel.snp.makeConstraints { make in
|
||||||
|
make.center.equalToSuperview()
|
||||||
|
make.left.equalToSuperview().offset(7)
|
||||||
|
}
|
||||||
|
|
||||||
|
tipLabel.snp.makeConstraints { make in
|
||||||
|
make.left.equalTo(desBgView)
|
||||||
|
make.top.equalTo(desBgView.snp.bottom).offset(5)
|
||||||
}
|
}
|
||||||
|
|
||||||
selectedImageView.snp.makeConstraints { make in
|
selectedImageView.snp.makeConstraints { make in
|
||||||
make.left.equalToSuperview()
|
make.left.equalToSuperview()
|
||||||
make.top.equalToSuperview().offset(18)
|
make.top.equalToSuperview()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
@ -5,12 +5,12 @@
|
|||||||
"scale" : "1x"
|
"scale" : "1x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "顶部bg@2x.png",
|
"filename" : "hot@2x.png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "顶部bg@3x.png",
|
"filename" : "hot@3x.png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"scale" : "3x"
|
"scale" : "3x"
|
||||||
}
|
}
|
BIN
Veloria/Source/Assets.xcassets/icon/hot_icon_04.imageset/hot@2x.png
vendored
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
Veloria/Source/Assets.xcassets/icon/hot_icon_04.imageset/hot@3x.png
vendored
Normal file
After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 740 B After Width: | Height: | Size: 690 B |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 929 B |
BIN
Veloria/Source/Assets.xcassets/icon/selected_icon_02.imageset/Component 65@2x.png
vendored
Normal file
After Width: | Height: | Size: 660 B |
BIN
Veloria/Source/Assets.xcassets/icon/selected_icon_02.imageset/Component 65@3x.png
vendored
Normal file
After Width: | Height: | Size: 914 B |
@ -5,12 +5,12 @@
|
|||||||
"scale" : "1x"
|
"scale" : "1x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "Recharge & Unlock More@2x.png",
|
"filename" : "Component 65@2x.png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "Recharge & Unlock More@3x.png",
|
"filename" : "Component 65@3x.png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"scale" : "3x"
|
"scale" : "3x"
|
||||||
}
|
}
|
22
Veloria/Source/Assets.xcassets/icon/vip_buy_bg_icon_month.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "会员icon@2x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "会员icon@3x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
Veloria/Source/Assets.xcassets/icon/vip_buy_bg_icon_month.imageset/会员icon@2x.png
vendored
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
Veloria/Source/Assets.xcassets/icon/vip_buy_bg_icon_month.imageset/会员icon@3x.png
vendored
Normal file
After Width: | Height: | Size: 121 KiB |
22
Veloria/Source/Assets.xcassets/icon/vip_buy_bg_icon_quarter.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "会员icon@2x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "会员icon@3x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
Veloria/Source/Assets.xcassets/icon/vip_buy_bg_icon_quarter.imageset/会员icon@2x.png
vendored
Normal file
After Width: | Height: | Size: 62 KiB |
BIN
Veloria/Source/Assets.xcassets/icon/vip_buy_bg_icon_quarter.imageset/会员icon@3x.png
vendored
Normal file
After Width: | Height: | Size: 116 KiB |
22
Veloria/Source/Assets.xcassets/icon/vip_buy_bg_icon_week.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "会员icon@2x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "会员icon@3x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
Veloria/Source/Assets.xcassets/icon/vip_buy_bg_icon_week.imageset/会员icon@2x.png
vendored
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
Veloria/Source/Assets.xcassets/icon/vip_buy_bg_icon_week.imageset/会员icon@3x.png
vendored
Normal file
After Width: | Height: | Size: 120 KiB |
22
Veloria/Source/Assets.xcassets/icon/vip_buy_bg_icon_year.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "会员icon@2x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "会员icon@3x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
Veloria/Source/Assets.xcassets/icon/vip_buy_bg_icon_year.imageset/会员icon@2x.png
vendored
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
Veloria/Source/Assets.xcassets/icon/vip_buy_bg_icon_year.imageset/会员icon@3x.png
vendored
Normal file
After Width: | Height: | Size: 122 KiB |
Before Width: | Height: | Size: 399 KiB |
Before Width: | Height: | Size: 836 KiB |
Before Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 47 KiB |
22
Veloria/Source/Assets.xcassets/image/coin_big_bg_image.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Rectangle 35@2x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Rectangle 35@3x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
Veloria/Source/Assets.xcassets/image/coin_big_bg_image.imageset/Rectangle 35@2x.png
vendored
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
Veloria/Source/Assets.xcassets/image/coin_big_bg_image.imageset/Rectangle 35@3x.png
vendored
Normal file
After Width: | Height: | Size: 148 KiB |
22
Veloria/Source/Assets.xcassets/image/coin_small_bg_image.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Rectangle 35@2x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Rectangle 35@3x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
Veloria/Source/Assets.xcassets/image/coin_small_bg_image.imageset/Rectangle 35@2x.png
vendored
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
Veloria/Source/Assets.xcassets/image/coin_small_bg_image.imageset/Rectangle 35@3x.png
vendored
Normal file
After Width: | Height: | Size: 96 KiB |
@ -5,12 +5,12 @@
|
|||||||
"scale" : "1x"
|
"scale" : "1x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "香槟金色会员卡bg@2x.png",
|
"filename" : "银色色会员卡bg@2x.png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "香槟金色会员卡bg@3x.png",
|
"filename" : "银色色会员卡bg@3x.png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"scale" : "3x"
|
"scale" : "3x"
|
||||||
}
|
}
|
||||||
|
BIN
Veloria/Source/Assets.xcassets/image/vip_buy_bg_month.imageset/银色色会员卡bg@2x.png
vendored
Normal file
After Width: | Height: | Size: 141 KiB |
BIN
Veloria/Source/Assets.xcassets/image/vip_buy_bg_month.imageset/银色色会员卡bg@3x.png
vendored
Normal file
After Width: | Height: | Size: 311 KiB |
Before Width: | Height: | Size: 184 KiB |
Before Width: | Height: | Size: 389 KiB |
@ -5,12 +5,12 @@
|
|||||||
"scale" : "1x"
|
"scale" : "1x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "香槟金色会员卡bg@2x.png",
|
"filename" : "紫色会员卡bg@2x.png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "香槟金色会员卡bg@3x.png",
|
"filename" : "紫色会员卡bg@3x.png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"scale" : "3x"
|
"scale" : "3x"
|
||||||
}
|
}
|
||||||
|
BIN
Veloria/Source/Assets.xcassets/image/vip_buy_bg_quarter.imageset/紫色会员卡bg@2x.png
vendored
Normal file
After Width: | Height: | Size: 126 KiB |
BIN
Veloria/Source/Assets.xcassets/image/vip_buy_bg_quarter.imageset/紫色会员卡bg@3x.png
vendored
Normal file
After Width: | Height: | Size: 275 KiB |
Before Width: | Height: | Size: 178 KiB |
Before Width: | Height: | Size: 380 KiB |
Before Width: | Height: | Size: 180 KiB After Width: | Height: | Size: 140 KiB |
Before Width: | Height: | Size: 383 KiB After Width: | Height: | Size: 311 KiB |
@ -5,12 +5,12 @@
|
|||||||
"scale" : "1x"
|
"scale" : "1x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "香槟金色会员卡bg@2x.png",
|
"filename" : "金色会员卡bg@2x.png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "香槟金色会员卡bg@3x.png",
|
"filename" : "金色会员卡bg@3x.png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"scale" : "3x"
|
"scale" : "3x"
|
||||||
}
|
}
|
||||||
|
BIN
Veloria/Source/Assets.xcassets/image/vip_buy_bg_year.imageset/金色会员卡bg@2x.png
vendored
Normal file
After Width: | Height: | Size: 139 KiB |
BIN
Veloria/Source/Assets.xcassets/image/vip_buy_bg_year.imageset/金色会员卡bg@3x.png
vendored
Normal file
After Width: | Height: | Size: 306 KiB |
Before Width: | Height: | Size: 179 KiB |
Before Width: | Height: | Size: 381 KiB |
@ -94,6 +94,7 @@
|
|||||||
"veloria_year" = "1 year";
|
"veloria_year" = "1 year";
|
||||||
"veloria_days_count_text" = "## days";
|
"veloria_days_count_text" = "## days";
|
||||||
"veloria_last_play_episode" = "Last time Episode ##";
|
"veloria_last_play_episode" = "Last time Episode ##";
|
||||||
|
"veloria_coin_buy_title" = "Top Up | Indefinitely use";
|
||||||
|
|
||||||
|
|
||||||
"veloria_bonus_count_text" = "+## Bonus";
|
"veloria_bonus_count_text" = "+## Bonus";
|
||||||
|