Compare commits

..

2 Commits
1.0.4 ... main

Author SHA1 Message Date
zjx
1cf2c2dde2 充值排序,UI优化,1.0.5提审 2025-06-26 10:41:49 +08:00
zjx
ade3e2c2bd 延迟深度链接调试 2025-06-25 20:05:47 +08:00
21 changed files with 301 additions and 94 deletions

View File

@ -305,7 +305,6 @@
1B056E762DDB3641007EE38D /* VPTabBarItemNormalVew.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPTabBarItemNormalVew.swift; sourceTree = "<group>"; }; 1B056E762DDB3641007EE38D /* VPTabBarItemNormalVew.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPTabBarItemNormalVew.swift; sourceTree = "<group>"; };
1B056E782DDB365A007EE38D /* VPTabBarItemSelectedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPTabBarItemSelectedView.swift; sourceTree = "<group>"; }; 1B056E782DDB365A007EE38D /* VPTabBarItemSelectedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPTabBarItemSelectedView.swift; sourceTree = "<group>"; };
1B056E7A2DDB37BA007EE38D /* VPGradientView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPGradientView.swift; sourceTree = "<group>"; }; 1B056E7A2DDB37BA007EE38D /* VPGradientView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPGradientView.swift; sourceTree = "<group>"; };
316330F9CC4DB54283ADC8A9 /* Pods-VideoPlayer.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VideoPlayer.release.xcconfig"; path = "Target Support Files/Pods-VideoPlayer/Pods-VideoPlayer.release.xcconfig"; sourceTree = "<group>"; };
34F57E87E765BF8D72A43DCA /* Pods_Veloria.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Veloria.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 34F57E87E765BF8D72A43DCA /* Pods_Veloria.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Veloria.framework; sourceTree = BUILT_PRODUCTS_DIR; };
831DCE145EAEF22088BB06E4 /* Pods-Veloria.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Veloria.debug.xcconfig"; path = "Target Support Files/Pods-Veloria/Pods-Veloria.debug.xcconfig"; sourceTree = "<group>"; }; 831DCE145EAEF22088BB06E4 /* Pods-Veloria.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Veloria.debug.xcconfig"; path = "Target Support Files/Pods-Veloria/Pods-Veloria.debug.xcconfig"; sourceTree = "<group>"; };
AA827CC8ACC3AE70E33A0EEB /* Pods-Veloria.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Veloria.release.xcconfig"; path = "Target Support Files/Pods-Veloria/Pods-Veloria.release.xcconfig"; sourceTree = "<group>"; }; AA827CC8ACC3AE70E33A0EEB /* Pods-Veloria.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Veloria.release.xcconfig"; path = "Target Support Files/Pods-Veloria/Pods-Veloria.release.xcconfig"; sourceTree = "<group>"; };
@ -524,7 +523,6 @@
BFF5B2782DF679720044227A /* VPMoreVideoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPMoreVideoViewController.swift; sourceTree = "<group>"; }; BFF5B2782DF679720044227A /* VPMoreVideoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPMoreVideoViewController.swift; sourceTree = "<group>"; };
BFF5B4AE2DF6B6630044227A /* VPMutualCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPMutualCollectionView.swift; sourceTree = "<group>"; }; BFF5B4AE2DF6B6630044227A /* VPMutualCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPMutualCollectionView.swift; sourceTree = "<group>"; };
BFF5B6E42DF7C8580044227A /* VPEmptyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPEmptyView.swift; sourceTree = "<group>"; }; BFF5B6E42DF7C8580044227A /* VPEmptyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPEmptyView.swift; sourceTree = "<group>"; };
E0BDA3570E00C90877E45AA0 /* Pods-VideoPlayer.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VideoPlayer.debug.xcconfig"; path = "Target Support Files/Pods-VideoPlayer/Pods-VideoPlayer.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@ -806,8 +804,6 @@
97790501CCBF987017A55C80 /* Pods */ = { 97790501CCBF987017A55C80 /* Pods */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
E0BDA3570E00C90877E45AA0 /* Pods-VideoPlayer.debug.xcconfig */,
316330F9CC4DB54283ADC8A9 /* Pods-VideoPlayer.release.xcconfig */,
831DCE145EAEF22088BB06E4 /* Pods-Veloria.debug.xcconfig */, 831DCE145EAEF22088BB06E4 /* Pods-Veloria.debug.xcconfig */,
AA827CC8ACC3AE70E33A0EEB /* Pods-Veloria.release.xcconfig */, AA827CC8ACC3AE70E33A0EEB /* Pods-Veloria.release.xcconfig */,
); );
@ -1798,7 +1794,7 @@
CODE_SIGN_ENTITLEMENTS = Veloria/Veloria.entitlements; CODE_SIGN_ENTITLEMENTS = Veloria/Veloria.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 4; CURRENT_PROJECT_VERSION = 5;
DEVELOPMENT_TEAM = 394VH538M8; DEVELOPMENT_TEAM = 394VH538M8;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Veloria/Source/Info.plist; INFOPLIST_FILE = Veloria/Source/Info.plist;
@ -1817,7 +1813,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.4; MARKETING_VERSION = 1.0.5;
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 = "";
@ -1841,7 +1837,7 @@
CODE_SIGN_ENTITLEMENTS = Veloria/Veloria.entitlements; CODE_SIGN_ENTITLEMENTS = Veloria/Veloria.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 4; CURRENT_PROJECT_VERSION = 5;
DEVELOPMENT_TEAM = 394VH538M8; DEVELOPMENT_TEAM = 394VH538M8;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Veloria/Source/Info.plist; INFOPLIST_FILE = Veloria/Source/Info.plist;
@ -1860,7 +1856,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.4; MARKETING_VERSION = 1.0.5;
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 = "";

View File

@ -7,6 +7,7 @@
import UIKit import UIKit
import FacebookCore import FacebookCore
import AdjustSdk
extension SceneDelegate { extension SceneDelegate {
@ -17,30 +18,35 @@ extension SceneDelegate {
//facebook //facebook
let result = ApplicationDelegate.shared.application(UIApplication.shared, open: url, sourceApplication: nil, annotation: [UIApplication.OpenURLOptionsKey.annotation]) let result = ApplicationDelegate.shared.application(UIApplication.shared, open: url, sourceApplication: nil, annotation: [UIApplication.OpenURLOptionsKey.annotation])
if !result { if !result {
if let link = ADJDeeplink(deeplink: url) {
Adjust.processDeeplink(link)
}
vp_handleOpenAppMessage(webpageURL: url) vp_handleOpenAppMessage(webpageURL: url)
} }
} }
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
guard let webpageURL = userActivity.webpageURL else { return } guard let webpageURL = userActivity.webpageURL else { return }
vp_handleOpenAppMessage(webpageURL: webpageURL) let result = ApplicationDelegate.shared.application(UIApplication.shared, continue: userActivity)
if !result {
vp_handleOpenAppMessage(webpageURL: webpageURL)
}
} }
} }
extension SceneDelegate { extension SceneDelegate {
/// ///(APP)
static var hasOpenMessage = false static var allowOpenMessage = true
/// ///
static var isNeedRetry = false static var isNeedRetry = false
private static var webpageURL: URL? private static var webpageURL: URL?
func vp_handleOpenAppMessage(webpageURL: URL?) { func vp_handleOpenAppMessage(webpageURL: URL?) {
guard VPNetworkReachabilityManager.manager.isReachable == true, // guard VPNetworkReachabilityManager.manager.isReachable == true, //
AppDelegate.haveBeenShownAPNS, // // AppDelegate.haveBeenShownAPNS, //
self.isOpenApp, //APP self.isOpenApp, //APP
VPAppTool.idfaAuthorizationFinish //idfa VPAppTool.idfaAuthorizationFinish //idfa
else { else {
@ -60,21 +66,16 @@ extension SceneDelegate {
} }
private func _handleOpenAppMessage(webpageURL: URL?) { private func _handleOpenAppMessage(webpageURL: URL?) {
if Self.hasOpenMessage { return }
Self.hasOpenMessage = true guard SceneDelegate.allowOpenMessage else { return }
SceneDelegate.allowOpenMessage = false
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
Self.hasOpenMessage = false
}
//URL //URL
var statUrlStr: String? = webpageURL?.absoluteString var statUrlStr: String? = webpageURL?.absoluteString
var data: [String : Any]? = webpageURL?.query?.vp_urlQuryToDictionary() var data: [String : Any]? = webpageURL?.query?.vp_urlQuryToDictionary()
if let pasteStr = UIPasteboard.general.string, pasteStr.contains("veloriaapp") { if statUrlStr == nil, let pasteStr = UIPasteboard.general.string, pasteStr.contains("veloriaapp") {
UIPasteboard.general.string = nil
let tempArr = pasteStr.components(separatedBy: "?") let tempArr = pasteStr.components(separatedBy: "?")
let query = tempArr.last let query = tempArr.last
@ -85,7 +86,7 @@ extension SceneDelegate {
} }
} }
UIPasteboard.general.string = nil

View File

@ -19,7 +19,25 @@ extension AppDelegate {
MJRefreshConfig.default.languageCode = VPLocalizedManager.shared.mjLocalizedKey MJRefreshConfig.default.languageCode = VPLocalizedManager.shared.mjLocalizedKey
//Adjust //Adjust
#if DEBUG
let config = ADJConfig(appToken: "jmtc740fki68", environment: ADJEnvironmentSandbox)
config?.logLevel = .verbose
#else
let config = ADJConfig(appToken: "jmtc740fki68", environment: ADJEnvironmentProduction) let config = ADJConfig(appToken: "jmtc740fki68", environment: ADJEnvironmentProduction)
#endif
config?.delegate = self
Adjust.initSdk(config) Adjust.initSdk(config)
AppLinkUtility.fetchDeferredAppLink { url, error in
if let url = url, error != nil {
VPAppTool.sceneDelegate?.vp_handleOpenAppMessage(webpageURL: url)
}
}
}
}
extension AppDelegate: AdjustDelegate {
func adjustDeferredDeeplinkReceived(_ deeplink: URL?) -> Bool {
return true
} }
} }

View File

@ -71,6 +71,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
func sceneDidEnterBackground(_ scene: UIScene) { func sceneDidEnterBackground(_ scene: UIScene) {
vpLog(message: "++++++++++++++sceneDidEnterBackground") vpLog(message: "++++++++++++++sceneDidEnterBackground")
SceneDelegate.allowOpenMessage = true
} }

View File

@ -77,7 +77,8 @@ class VPWebView: WKWebView {
func load(urlStr: String) { func load(urlStr: String) {
guard let url = URL(string: urlStr) else { return } guard let url = URL(string: urlStr) else { return }
let request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 30) // let request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 30)
let request = URLRequest(url: url, cachePolicy: .returnCacheDataElseLoad, timeoutInterval: 30)
self.load(request) self.load(request)
} }

View File

@ -15,6 +15,11 @@ class VPMoreVideoViewController: VPViewController {
} }
} }
private lazy var bgView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "more_bg_image"))
return imageView
}()
private lazy var titleLeftImageView: UIImageView = { private lazy var titleLeftImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "title_icon_01")) let imageView = UIImageView(image: UIImage(named: "title_icon_01"))
return imageView return imageView
@ -67,11 +72,16 @@ class VPMoreVideoViewController: VPViewController {
extension VPMoreVideoViewController { extension VPMoreVideoViewController {
private func vp_setupUI() { private func vp_setupUI() {
view.addSubview(bgView)
view.addSubview(titleLeftImageView) view.addSubview(titleLeftImageView)
view.addSubview(titleRightImageView) view.addSubview(titleRightImageView)
view.addSubview(titleLabel) view.addSubview(titleLabel)
view.addSubview(collectionView) view.addSubview(collectionView)
bgView.snp.makeConstraints { make in
make.left.right.top.equalToSuperview()
}
titleLeftImageView.snp.makeConstraints { make in titleLeftImageView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15) make.left.equalToSuperview().offset(15)
make.top.equalToSuperview().offset(UIScreen.navBarHeight + 10) make.top.equalToSuperview().offset(UIScreen.navBarHeight + 10)

View File

@ -26,6 +26,7 @@ class VPDetailRecommandBannerCell: FSPagerViewCell {
} }
} }
private(set) lazy var player: VPPlayer = { private(set) lazy var player: VPPlayer = {
let player = VPPlayer() let player = VPPlayer()
player.playerView = playerView player.playerView = playerView
@ -33,33 +34,52 @@ class VPDetailRecommandBannerCell: FSPagerViewCell {
return player return player
}() }()
private(set) lazy var bgView: UIView = {
let view = VPGradientView()
view.isHidden = true
view.layer.cornerRadius = 14
view.layer.masksToBounds = true
view.colors = [UIColor.color05CEA0(alpha: 0.5).cgColor, UIColor.color7C174F(alpha: 0.5).cgColor]
view.locations = [0, 1]
view.startPoint = .init(x: 0, y: 0.3)
view.endPoint = .init(x: 1, y: 0.8)
return view
}()
private lazy var coverImageView: VPImageView = { private lazy var coverImageView: VPImageView = {
let imageView = VPImageView() let imageView = VPImageView()
imageView.layer.cornerRadius = bgView.layer.cornerRadius
imageView.layer.masksToBounds = true
return imageView return imageView
}() }()
private lazy var playerView: UIView = { private lazy var playerView: UIView = {
let view = UIView() let view = UIView()
view.layer.cornerRadius = bgView.layer.cornerRadius
view.layer.masksToBounds = true
return view return view
}() }()
override init(frame: CGRect) { override init(frame: CGRect) {
super.init(frame: frame) super.init(frame: frame)
contentView.layer.cornerRadius = 14
contentView.layer.masksToBounds = true
contentView.addSubview(bgView)
contentView.addSubview(playerView) contentView.addSubview(playerView)
contentView.addSubview(coverImageView) contentView.addSubview(coverImageView)
coverImageView.snp.makeConstraints { make in
bgView.snp.makeConstraints { make in
make.edges.equalToSuperview() make.edges.equalToSuperview()
} }
coverImageView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(2.5)
make.top.equalToSuperview().offset(2.5)
make.center.equalToSuperview()
}
playerView.snp.makeConstraints { make in playerView.snp.makeConstraints { make in
make.edges.equalToSuperview() make.edges.equalTo(coverImageView)
} }
} }

View File

@ -34,8 +34,10 @@ class VPDetailRecommandView: HWPanModalContentView {
oldValue?.isCurrentPlayer = false oldValue?.isCurrentPlayer = false
oldValue?.player.pause() oldValue?.player.pause()
oldValue?.bgView.isHidden = true
currentCell?.isCurrentPlayer = true currentCell?.isCurrentPlayer = true
currentCell?.bgView.isHidden = false
} }
} }
@ -297,6 +299,9 @@ extension VPDetailRecommandView: FSPagerViewDelegate, FSPagerViewDataSource {
func pagerView(_ pagerView: FSPagerView, cellForItemAt index: Int) -> FSPagerViewCell { func pagerView(_ pagerView: FSPagerView, cellForItemAt index: Int) -> FSPagerViewCell {
let cell = pagerView.dequeueReusableCell(withReuseIdentifier: "cell", at: index) as! VPDetailRecommandBannerCell let cell = pagerView.dequeueReusableCell(withReuseIdentifier: "cell", at: index) as! VPDetailRecommandBannerCell
cell.model = self.dataArr[index] cell.model = self.dataArr[index]
if currentCell == nil, index == 0 {
cell.bgView.isHidden = false
}
return cell return cell
} }
@ -312,5 +317,6 @@ extension VPDetailRecommandView: FSPagerViewDelegate, FSPagerViewDataSource {
} }
} }

View File

@ -25,40 +25,55 @@ class VPPlayerRechargeView: HWPanModalContentView {
var model: VPPayTemplateModel? { var model: VPPayTemplateModel? {
didSet { didSet {
stackView.removeAllArrangedSubview() stackView.removeAllArrangedSubview()
guard let model = self.model else { return }
if let model = self.model { if let sort = model.sort, sort.count > 0 {
sort.forEach {
if let list = model.list_sub_vip, list.count > 0 { if $0 == .vip {
self.stackView.addArrangedSubview(self.vipView) addVipView()
self.vipView.dataArr = list } else if $0 == .coin {
} addCoinView()
if let list = model.list_coins, list.count > 0 {
self.stackView.addArrangedSubview(self.coinsView)
self.coinsView.dataArr = list
}
if self.stackView.arrangedSubviews.count == 1,
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)
} }
} }
} else {
addVipView()
self.stackView.addArrangedSubview(tipView) addCoinView()
} }
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
self.stackView.addArrangedSubview(tipView)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in
self?.panModalSetNeedsLayoutUpdate() self?.panModalSetNeedsLayoutUpdate()
} }
} }
} }
var unlockCoin: Int? {
didSet {
guard let coin = unlockCoin, coin > 0 else {
self.unlockCoinBgView.isHidden = true
return
}
self.unlockCoinBgView.isHidden = false
let coinCountStr = " \(coin)"
let text = "veloria_unlock".localized + coinCountStr
let coinRange = text.ocString().range(of: coinCountStr)
let string = NSMutableAttributedString(string: text)
string.color = .colorFFFFFF()
string.font = .fontRegular(ofSize: 13)
string.setColor(.color05CEA0(), range: coinRange)
string.setFont(.fontMedium(ofSize: 13), range: coinRange)
unlockCoinLabel.attributedText = string
}
}
var buyFinishBlock: (() -> Void)? var buyFinishBlock: (() -> Void)?
var vipBuyFinishBlock: (() -> Void)? var vipBuyFinishBlock: (() -> Void)?
@ -81,6 +96,22 @@ class VPPlayerRechargeView: HWPanModalContentView {
return label return label
}() }()
private lazy var unlockCoinBgView: UIView = {
let view = VPGradientView()
view.colors = [UIColor.color05CEA0(alpha: 0.5).cgColor, UIColor.color7C174F(alpha: 0.5).cgColor]
view.locations = [0, 1]
view.startPoint = .init(x: 0, y: 0.3)
view.endPoint = .init(x: 1, y: 0.8)
view.layer.cornerRadius = 13
view.layer.masksToBounds = true
return view
}()
private lazy var unlockCoinLabel: UILabel = {
let label = UILabel()
return label
}()
private lazy var coinIconImageView: UIImageView = { private lazy var coinIconImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "coin_icon_07")) let imageView = UIImageView(image: UIImage(named: "coin_icon_07"))
return imageView return imageView
@ -88,6 +119,7 @@ class VPPlayerRechargeView: HWPanModalContentView {
private lazy var scrollView: VPScrollView = { private lazy var scrollView: VPScrollView = {
let scrollView = VPScrollView() let scrollView = VPScrollView()
scrollView.isScrollEnabled = true
return scrollView return scrollView
}() }()
@ -239,6 +271,20 @@ class VPPlayerRechargeView: HWPanModalContentView {
extension VPPlayerRechargeView { extension VPPlayerRechargeView {
private func addVipView() {
if let list = model?.list_sub_vip, list.count > 0 {
self.stackView.addArrangedSubview(self.vipView)
self.vipView.dataArr = list
}
}
private func addCoinView() {
if let list = model?.list_coins, list.count > 0 {
self.stackView.addArrangedSubview(self.coinsView)
self.coinsView.dataArr = list
}
}
@objc private func updateCoin() { @objc private func updateCoin() {
let coinCountStr = " \(VPLoginManager.manager.userInfo?.totalCoin ?? 0)" let coinCountStr = " \(VPLoginManager.manager.userInfo?.totalCoin ?? 0)"
let text = "veloria_your_coins".localized + coinCountStr let text = "veloria_your_coins".localized + coinCountStr
@ -265,7 +311,10 @@ extension VPPlayerRechargeView {
addSubview(bgView) addSubview(bgView)
addSubview(closeButton) addSubview(closeButton)
addSubview(coinLabel) addSubview(coinLabel)
addSubview(coinIconImageView) // addSubview(coinIconImageView)
addSubview(unlockCoinBgView)
unlockCoinBgView.addSubview(unlockCoinLabel)
unlockCoinBgView.addSubview(coinIconImageView)
addSubview(scrollView) addSubview(scrollView)
scrollView.addSubview(stackView) scrollView.addSubview(stackView)
@ -282,17 +331,29 @@ extension VPPlayerRechargeView {
coinLabel.snp.makeConstraints { make in coinLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15) make.left.equalToSuperview().offset(15)
make.centerY.equalTo(coinIconImageView) make.centerY.equalTo(closeButton)
}
unlockCoinBgView.snp.makeConstraints { make in
make.left.equalTo(coinLabel.snp.right).offset(6)
make.centerY.equalTo(coinLabel)
make.height.equalTo(26)
}
unlockCoinLabel.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.left.equalToSuperview().offset(12)
} }
coinIconImageView.snp.makeConstraints { make in coinIconImageView.snp.makeConstraints { make in
make.left.equalTo(coinLabel.snp.right).offset(3) make.centerY.equalToSuperview()
make.centerY.equalTo(closeButton) make.left.equalTo(unlockCoinLabel.snp.right).offset(2)
make.right.equalToSuperview().offset(-12)
} }
scrollView.snp.makeConstraints { make in scrollView.snp.makeConstraints { make in
make.left.right.equalToSuperview() make.left.right.equalToSuperview()
make.top.equalToSuperview().offset(41) make.top.equalToSuperview().offset(48)
make.bottom.equalToSuperview() make.bottom.equalToSuperview()
} }

View File

@ -88,6 +88,11 @@ extension VPVideoPlayViewModel {
let view = VPPlayerRechargeView() let view = VPPlayerRechargeView()
view.model = model view.model = model
if videoInfo.is_lock != true {
view.unlockCoin = nil
} else {
view.unlockCoin = videoInfo.coins
}
view.shortPlayId = videoInfo.short_play_id view.shortPlayId = videoInfo.short_play_id
view.videoId = videoInfo.short_play_video_id view.videoId = videoInfo.short_play_video_id
view.buyFinishBlock = { [weak self] in view.buyFinishBlock = { [weak self] in

View File

@ -11,6 +11,8 @@ class VPStoreViewController: VPViewController {
///vip ///vip
var vipBuyFinishBlock: (() -> Void)? var vipBuyFinishBlock: (() -> Void)?
private var templateModel: VPPayTemplateModel?
private lazy var scrollView: VPScrollView = { private lazy var scrollView: VPScrollView = {
let scrollView = VPScrollView() let scrollView = VPScrollView()
@ -88,6 +90,42 @@ class VPStoreViewController: VPViewController {
} }
} }
extension VPStoreViewController {
private func updateLayout() {
guard let model = self.templateModel else { return }
if let sort = model.sort, sort.count > 0 {
sort.forEach {
if $0 == .vip {
addVipView()
} else if $0 == .coin {
addCoinView()
}
}
} else {
addVipView()
addCoinView()
}
}
private func addVipView() {
if let list = templateModel?.list_sub_vip, list.count > 0 {
self.stackView.addArrangedSubview(self.vipView)
self.vipView.dataArr = list
}
}
private func addCoinView() {
if let list = templateModel?.list_coins, list.count > 0 {
self.stackView.addArrangedSubview(self.coinsView)
self.coinsView.dataArr = list
}
}
}
extension VPStoreViewController { extension VPStoreViewController {
private func vp_setupUI() { private func vp_setupUI() {
@ -115,18 +153,11 @@ extension VPStoreViewController {
VPWalletAPI.requestPayTemplate { [weak self] model in VPWalletAPI.requestPayTemplate { [weak self] model in
guard let self = self else { return } guard let self = self else { return }
self.stackView.removeAllArrangedSubview()
if let model = model { if let model = model {
self.stackView.removeAllArrangedSubview() self.templateModel = model
self.updateLayout()
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) self.stackView.addArrangedSubview(self.tipView)
} }

View File

@ -10,6 +10,12 @@ import SmartCodable
class VPPayTemplateModel: VPModel, SmartCodable { class VPPayTemplateModel: VPModel, SmartCodable {
enum SortName: String, SmartCaseDefaultable {
case coin = "list_coins"
case vip = "list_sub_vip"
}
var list_coins: [VPPayTemplateItem]? var list_coins: [VPPayTemplateItem]?
var list_sub_vip: [VPPayTemplateItem]? var list_sub_vip: [VPPayTemplateItem]?
var sort: [SortName]?
} }

View File

@ -30,13 +30,15 @@ class VPStoreCoinsBuyView: UIView {
} }
} }
CATransaction.setCompletionBlock { [weak self] in UIView.performWithoutAnimation { [weak self] in
guard let self = self else { return } self?.reloadData()
self.updateLayout() }
self.bigCollectionView.performBatchUpdates(nil) { [weak self] _ in
self?.updateLayout()
}
self.smallCollectionView.performBatchUpdates(nil) { [weak self] _ in
self?.updateLayout()
} }
CATransaction.begin()
self.reloadData()
CATransaction.commit()
} }
} }

View File

@ -9,15 +9,15 @@ import UIKit
class VPStoreVipBuyView: UIView { class VPStoreVipBuyView: UIView {
override var intrinsicContentSize: CGSize { // override var intrinsicContentSize: CGSize {
var height: CGFloat = 1 // var height: CGFloat = 1
//
if dataArr.count > 0, collectionView.contentSize.height > 0 { // if dataArr.count > 0, collectionView.contentSize.height > 0 {
height = collectionView.contentSize.height + 1 // height = collectionView.contentSize.height + 1
} // }
//
return .init(width: UIScreen.width, height: height) // return .init(width: UIScreen.width, height: height)
} // }
var buyFinishBlock: (() -> Void)? var buyFinishBlock: (() -> Void)?
@ -31,7 +31,11 @@ class VPStoreVipBuyView: UIView {
self?.collectionView.reloadData() self?.collectionView.reloadData()
} }
self.collectionView.performBatchUpdates(nil) { [weak self] _ in self.collectionView.performBatchUpdates(nil) { [weak self] _ in
self?.invalidateIntrinsicContentSize() guard let self = self else { return }
let height = self.collectionView.contentSize.height + 1
self.collectionView.snp.updateConstraints { make in
make.height.equalTo(height)
}
} }
} }
@ -39,6 +43,14 @@ class VPStoreVipBuyView: UIView {
private var currentIndex: Int? private var currentIndex: Int?
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.font = .fontMedium(ofSize: 13)
label.textColor = .colorFFFFFF()
label.text = "VIP |" + "veloria_store_auto_renew".localized
return label
}()
private lazy var collectionViewLayout: UICollectionViewFlowLayout = { private lazy var collectionViewLayout: UICollectionViewFlowLayout = {
let layout = UICollectionViewFlowLayout() let layout = UICollectionViewFlowLayout()
layout.itemSize = .init(width: UIScreen.width - 30, height: 130) layout.itemSize = .init(width: UIScreen.width - 30, height: 130)
@ -71,10 +83,18 @@ class VPStoreVipBuyView: UIView {
extension VPStoreVipBuyView { extension VPStoreVipBuyView {
private func vp_setupUI() { private func vp_setupUI() {
addSubview(titleLabel)
addSubview(collectionView) addSubview(collectionView)
titleLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.top.equalToSuperview()
}
collectionView.snp.makeConstraints { make in collectionView.snp.makeConstraints { make in
make.edges.equalToSuperview() make.left.right.bottom.equalToSuperview()
make.top.equalTo(titleLabel.snp.bottom)
make.height.equalTo(1)
} }
} }

View File

@ -21,6 +21,7 @@ class VPWalletHeaderItemView: UIView {
} }
} }
private var textAlignment: NSTextAlignment = .left
private lazy var coinCountLabel: UILabel = { private lazy var coinCountLabel: UILabel = {
let label = UILabel() let label = UILabel()
@ -36,8 +37,9 @@ class VPWalletHeaderItemView: UIView {
return label return label
}() }()
override init(frame: CGRect) { init(textAlignment: NSTextAlignment) {
super.init(frame: frame) super.init(frame: .zero)
self.textAlignment = textAlignment
vp_setupUI() vp_setupUI()
} }
@ -56,13 +58,16 @@ extension VPWalletHeaderItemView {
titleLabel.snp.makeConstraints { make in titleLabel.snp.makeConstraints { make in
// make.left.equalTo(coinCountLabel) if self.textAlignment == .left {
make.centerX.equalToSuperview() make.left.equalToSuperview().offset(20)
} else if self.textAlignment == .center {
make.centerX.equalToSuperview().offset(-20)
}
make.top.equalToSuperview() make.top.equalToSuperview()
} }
coinCountLabel.snp.makeConstraints { make in coinCountLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview() make.left.equalTo(titleLabel)
make.bottom.equalToSuperview() make.bottom.equalToSuperview()
make.top.equalTo(titleLabel.snp.bottom).offset(5) make.top.equalTo(titleLabel.snp.bottom).offset(5)
} }

View File

@ -57,13 +57,13 @@ class VPWalletHeaderView: UIView {
}() }()
private lazy var rechargeCoinView: VPWalletHeaderItemView = { private lazy var rechargeCoinView: VPWalletHeaderItemView = {
let view = VPWalletHeaderItemView() let view = VPWalletHeaderItemView(textAlignment: .left)
view.title = "veloria_recharge".localized view.title = "veloria_recharge".localized
return view return view
}() }()
private lazy var sendCoinView: VPWalletHeaderItemView = { private lazy var sendCoinView: VPWalletHeaderItemView = {
let view = VPWalletHeaderItemView() let view = VPWalletHeaderItemView(textAlignment: .center)
view.title = "veloria_bonus".localized view.title = "veloria_bonus".localized
return view return view
}() }()

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: 412 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 715 KiB

View File

@ -101,6 +101,7 @@
"veloria_vip_activate_content" = "Activate vip and enjoy HD video privileges."; "veloria_vip_activate_content" = "Activate vip and enjoy HD video privileges.";
"veloria_later" = "Later"; "veloria_later" = "Later";
"veloria_go" = "Go"; "veloria_go" = "Go";
"veloria_unlock" = "Unlock:";
"veloria_bonus_count_text" = "+## Bonus"; "veloria_bonus_count_text" = "+## Bonus";

View File

@ -12,6 +12,7 @@
<array> <array>
<string>applinks:qjwl168.com</string> <string>applinks:qjwl168.com</string>
<string>applinks:veloriaapp.go.link</string> <string>applinks:veloriaapp.go.link</string>
<string>applinks:lxjg.adj.st</string>
</array> </array>
<key>keychain-access-groups</key> <key>keychain-access-groups</key>
<array/> <array/>