bug修复 1.0.1发布
@ -1607,7 +1607,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0;
|
||||
MARKETING_VERSION = 1.0.1;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.qjwl168.veloria.ios;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
@ -1648,7 +1648,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0;
|
||||
MARKETING_VERSION = 1.0.1;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.qjwl168.veloria.ios;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
|
@ -35,6 +35,7 @@ class VPHomeListViewController: VPViewController, WMZPageProtocol {
|
||||
collectionView.vp_addRefreshBackFooter(insetBottom: 0) { [weak self] in
|
||||
self?.handleFooterRefresh(nil)
|
||||
}
|
||||
collectionView.vp_addNormalEmpty()
|
||||
collectionView.register(VPHomeListCell.self, forCellWithReuseIdentifier: "cell")
|
||||
return collectionView
|
||||
}()
|
||||
|
@ -168,6 +168,10 @@ extension VPMeViewController: UITableViewDelegate, UITableViewDataSource {
|
||||
let vc = VPFeedbackViewController()
|
||||
self.navigationController?.pushViewController(vc, animated: true)
|
||||
|
||||
case .orderRecord:
|
||||
let vc = VPWalletViewController()
|
||||
self.navigationController?.pushViewController(vc, animated: true)
|
||||
|
||||
default:
|
||||
break
|
||||
}
|
||||
@ -204,15 +208,16 @@ extension VPMeViewController {
|
||||
]
|
||||
|
||||
var cellArr: [VPMeItem] = []
|
||||
cellArr.append(VPMeItem(icon: UIImage(named: "me_item_icon_07"), title: "Order Record".localized, type: .orderRecord, cellKey: .normal))
|
||||
// cellArr.append(VPMeItem(icon: UIImage(named: "me_item_icon_05"), title: "Language".localized, type: .language, cellKey: .normal))
|
||||
if VPLoginManager.manager.userInfo?.is_tourist == false {
|
||||
cellArr.append(VPMeItem(icon: UIImage(named: "me_item_icon_06"), title: "Delete Account".localized, type: .deleteAccount, cellKey: .normal))
|
||||
}
|
||||
cellArr.append(VPMeItem(icon: UIImage(named: "me_item_icon_01"), title: "Privacy Policy".localized, type: .privacyPolicy, cellKey: .normal))
|
||||
cellArr.append(VPMeItem(icon: UIImage(named: "me_item_icon_02"), title: "User Agreement".localized, type: .userAgreement, cellKey: .normal))
|
||||
cellArr.append(VPMeItem(icon: UIImage(named: "me_item_icon_04"), title: "Help Center".localized, type: .feedback, cellKey: .normal))
|
||||
cellArr.append(VPMeItem(icon: UIImage(named: "me_item_icon_04"), title: "Feedback".localized, type: .feedback, cellKey: .normal))
|
||||
cellArr.append(VPMeItem(icon: UIImage(named: "me_item_icon_03"), title: "About Us".localized, type: .aboutUs, cellKey: .normal))
|
||||
|
||||
if VPLoginManager.manager.userInfo?.is_tourist == false {
|
||||
cellArr.append(VPMeItem(icon: UIImage(named: "me_item_icon_06"), title: "Delet Account".localized, type: .deleteAccount, cellKey: .normal))
|
||||
}
|
||||
|
||||
dataArr.append(cellArr)
|
||||
|
||||
|
@ -14,6 +14,7 @@ struct VPMeItem {
|
||||
case aboutUs
|
||||
case feedback
|
||||
case deleteAccount
|
||||
case orderRecord
|
||||
case informationProtection
|
||||
case civizatioConvention
|
||||
case informationSharing
|
||||
|
@ -94,7 +94,7 @@ extension VPMeUserInfoCell {
|
||||
contentView.addSubview(avatarImageView)
|
||||
contentView.addSubview(nicknameLabel)
|
||||
contentView.addSubview(idLabel)
|
||||
contentView.addSubview(loginButton)
|
||||
// contentView.addSubview(loginButton)
|
||||
|
||||
avatarImageView.snp.makeConstraints { make in
|
||||
make.left.equalToSuperview()
|
||||
@ -114,11 +114,11 @@ extension VPMeUserInfoCell {
|
||||
make.bottom.equalTo(avatarImageView).offset(-3)
|
||||
}
|
||||
|
||||
loginButton.snp.makeConstraints { make in
|
||||
make.centerY.equalTo(avatarImageView)
|
||||
make.right.equalToSuperview()
|
||||
make.height.equalTo(34)
|
||||
}
|
||||
// loginButton.snp.makeConstraints { make in
|
||||
// make.centerY.equalTo(avatarImageView)
|
||||
// make.right.equalToSuperview()
|
||||
// make.height.equalTo(34)
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
|
@ -190,7 +190,7 @@ class VPVideoPlayerViewController: VPViewController {
|
||||
CATransaction.setCompletionBlock { [weak self] in
|
||||
guard let self = self else { return }
|
||||
if !animated {
|
||||
if self.currentIndexPath != indexPath {
|
||||
if self.currentIndexPath != indexPath, indexPath.row < self.getDataCount() {
|
||||
self.skip(indexPath: indexPath)
|
||||
} else {
|
||||
self.play()
|
||||
|
@ -47,7 +47,7 @@ class VPShortModel: VPModel, SmartCodable {
|
||||
|
||||
static func mappingForKey() -> [SmartKeyTransformer]? {
|
||||
return [
|
||||
CodingKeys.vp_description <--- ["description"],
|
||||
CodingKeys.vp_description <--- ["description", "short_video_description"],
|
||||
CodingKeys.name <--- ["short_video_title", "name"]
|
||||
]
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ class VPPlayerCoinBuyView: UIView {
|
||||
var videoId: String?
|
||||
var buyFinishBlock: (() -> Void)?
|
||||
|
||||
private lazy var selectedIndex = 0
|
||||
private var selectedIndex: Int?
|
||||
|
||||
private lazy var collectionViewLayout: UICollectionViewFlowLayout = {
|
||||
|
||||
|
@ -20,7 +20,7 @@ class VPPlayerVipBuyView: UIView {
|
||||
|
||||
var buyFinishBlock: (() -> Void)?
|
||||
|
||||
private lazy var currentIndex: Int = 0
|
||||
private var currentIndex: Int?
|
||||
|
||||
private lazy var collectionViewLayout: UICollectionViewFlowLayout = {
|
||||
let layout = UICollectionViewFlowLayout()
|
||||
|
@ -95,8 +95,6 @@ class VPVideoPlayerCell: VPCollectionViewCell, VPPlayerProtocol {
|
||||
didSet {
|
||||
controlView.isCurrent = isCurrent
|
||||
if !isCurrent {
|
||||
// self.player.replay()
|
||||
// self.player.seekToTime(toTime: 0)
|
||||
self.coverImageView.isHidden = false
|
||||
}
|
||||
}
|
||||
@ -210,6 +208,7 @@ extension VPVideoPlayerCell: VPPlayerDelegate {
|
||||
|
||||
func vp_playerReadyToPlay(_ player: VPPlayer) {
|
||||
self.seekToTime(toTime: (videoInfo?.play_seconds ?? 0) / 1000)
|
||||
player.rate = self.viewModel?.rateModel.rate.getRate() ?? 1
|
||||
}
|
||||
|
||||
private func updateCoverShowState() {
|
||||
|
@ -201,11 +201,27 @@ extension VPVideoPlayerControlView {
|
||||
}
|
||||
|
||||
@objc private func handleCollectButton() {
|
||||
guard let shortPlayId = self.videoInfo?.short_play_id else { return }
|
||||
guard let videoId = self.videoInfo?.short_play_video_id else { return }
|
||||
|
||||
|
||||
let isCollect = !(self.shortModel?.is_collect ?? false)
|
||||
|
||||
if isCollect {
|
||||
self.collectShort(isCollect: isCollect)
|
||||
} else {
|
||||
let alert = VPAlertView(title: "kUnFavoritesAlertTitle".localized, subtitle: "kUnFavoritesAlertText".localized, icon: UIImage(named: "alert_icon_03"), normalButtonText: nil, highlightButtonText: "Confirm".localized)
|
||||
alert.show()
|
||||
|
||||
alert.clickHighlightButton = { [weak self] in
|
||||
self?.collectShort(isCollect: isCollect)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private func collectShort(isCollect: Bool) {
|
||||
guard let shortPlayId = self.videoInfo?.short_play_id else { return }
|
||||
guard let videoId = self.videoInfo?.short_play_video_id else { return }
|
||||
|
||||
VPVideoAPI.requestCollectShort(isCollect: isCollect, shortPlayId: shortPlayId, videoId: videoId) { [weak self] in
|
||||
guard let self = self else { return }
|
||||
var count = self.shortModel?.collect_total ?? 0
|
||||
|
@ -16,7 +16,7 @@ class VPCoinsViewController: VPViewController {
|
||||
}
|
||||
}
|
||||
|
||||
private lazy var selectedIndex = 0
|
||||
private var selectedIndex: Int?
|
||||
|
||||
//MARK: UI属性
|
||||
private lazy var scrollView: UIScrollView = {
|
||||
|
@ -29,6 +29,7 @@ class VPGiveCoinRecordsViewController: VPViewController {
|
||||
tableView.vp_addRefreshBackFooter(insetBottom: tableView.contentInset.bottom) { [weak self] in
|
||||
self?.handleFooterRefresh(nil)
|
||||
}
|
||||
tableView.vp_addNormalEmpty()
|
||||
tableView.register(VPGiveCoinRecordsCell.self, forCellReuseIdentifier: "cell")
|
||||
return tableView
|
||||
}()
|
||||
|
@ -16,7 +16,7 @@ class VPVipViewController: VPViewController {
|
||||
}
|
||||
}
|
||||
|
||||
private lazy var currentIndex: Int = 0
|
||||
private var currentIndex: Int?
|
||||
|
||||
private lazy var scrollView: UIScrollView = {
|
||||
let scrollView = VPScrollView()
|
||||
|
@ -13,6 +13,7 @@ class VPCoinRecordCell: VPWalletBaseCell {
|
||||
didSet {
|
||||
coinCountLabel.text = "+\(model?.value ?? "0")"
|
||||
timeLabel.text = model?.created_at
|
||||
titleLabel.text = model?.type
|
||||
}
|
||||
}
|
||||
|
||||
@ -21,7 +22,7 @@ class VPCoinRecordCell: VPWalletBaseCell {
|
||||
let label = UILabel()
|
||||
label.font = .fontRegular(ofSize: 14)
|
||||
label.textColor = .colorFFFFFF(alpha: 0.9)
|
||||
label.text = "Recharge Coins".localized
|
||||
|
||||
return label
|
||||
}()
|
||||
|
||||
|
@ -23,11 +23,15 @@ class VPCoinsBuyCell: VPCollectionViewCell {
|
||||
|
||||
if let sendCoins = item?.send_coins, sendCoins > 0, let coins = item?.coins {
|
||||
sendBgView.isHidden = false
|
||||
sendCountLabel.isHidden = false
|
||||
|
||||
sendCountLabel.text = String(format: "kBonusCoinCount".localized, "\(sendCoins)")
|
||||
let percent = CGFloat(sendCoins) / CGFloat(coins) * 100
|
||||
|
||||
sendLabel.text = String(format: "+%.0f%%".localized, percent)
|
||||
} else {
|
||||
sendBgView.isHidden = true
|
||||
sendCountLabel.isHidden = true
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -59,6 +63,11 @@ class VPCoinsBuyCell: VPCollectionViewCell {
|
||||
return imageView
|
||||
}()
|
||||
|
||||
private lazy var coinBgView: UIView = {
|
||||
let view = UIView()
|
||||
return view
|
||||
}()
|
||||
|
||||
private lazy var coinCountLabel: UILabel = {
|
||||
let label = UILabel()
|
||||
label.font = .fontMedium(ofSize: 16)
|
||||
@ -71,6 +80,13 @@ class VPCoinsBuyCell: VPCollectionViewCell {
|
||||
return imageView
|
||||
}()
|
||||
|
||||
private lazy var sendCountLabel: UILabel = {
|
||||
let label = UILabel()
|
||||
label.font = .fontRegular(ofSize: 12)
|
||||
label.textColor = .color05CEA0()
|
||||
return label
|
||||
}()
|
||||
|
||||
private lazy var priceLabel: UILabel = {
|
||||
let label = UILabel()
|
||||
label.font = .fontRegular(ofSize: 12)
|
||||
@ -131,8 +147,10 @@ extension VPCoinsBuyCell {
|
||||
private func vp_setupUI() {
|
||||
contentView.addSubview(bgView)
|
||||
contentView.addSubview(selectedImageView)
|
||||
contentView.addSubview(coinCountLabel)
|
||||
contentView.addSubview(iconImageView)
|
||||
contentView.addSubview(coinBgView)
|
||||
coinBgView.addSubview(coinCountLabel)
|
||||
coinBgView.addSubview(iconImageView)
|
||||
contentView.addSubview(sendCountLabel)
|
||||
contentView.addSubview(priceLabel)
|
||||
contentView.addSubview(hotBgView)
|
||||
hotBgView.addSubview(hotLabel)
|
||||
@ -148,14 +166,26 @@ extension VPCoinsBuyCell {
|
||||
make.bottom.right.equalToSuperview()
|
||||
}
|
||||
|
||||
coinCountLabel.snp.makeConstraints { make in
|
||||
coinBgView.snp.makeConstraints { make in
|
||||
make.centerX.equalToSuperview()
|
||||
make.top.equalToSuperview().offset(22)
|
||||
make.top.equalToSuperview().offset(28)
|
||||
}
|
||||
|
||||
coinCountLabel.snp.makeConstraints { make in
|
||||
make.left.equalToSuperview()
|
||||
make.centerY.equalToSuperview()
|
||||
}
|
||||
|
||||
sendCountLabel.snp.makeConstraints { make in
|
||||
make.centerX.equalToSuperview()
|
||||
make.top.equalTo(coinBgView.snp.bottom).offset(8)
|
||||
}
|
||||
|
||||
iconImageView.snp.makeConstraints { make in
|
||||
make.centerX.equalToSuperview()
|
||||
make.top.equalToSuperview().offset(45)
|
||||
make.left.equalTo(coinCountLabel.snp.right).offset(3)
|
||||
make.right.equalToSuperview()
|
||||
make.centerY.equalToSuperview()
|
||||
make.top.equalToSuperview()
|
||||
}
|
||||
|
||||
priceLabel.snp.makeConstraints { make in
|
||||
|
@ -13,6 +13,7 @@ class VPVIPRecordCell: VPWalletBaseCell {
|
||||
didSet {
|
||||
dayLabel.text = model?.value
|
||||
timeLabel.text = model?.created_at
|
||||
titleLabel.text = model?.type
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -180,6 +180,8 @@ extension VPIAPManager: JXIAPManagerDelegate {
|
||||
|
||||
if code == .noProduct {
|
||||
VPToast.show(text: "kIapErrorToast02".localized)
|
||||
} else if code == .cancelled {
|
||||
VPToast.show(text: "kIapErrorToast04".localized)
|
||||
}
|
||||
self.completionHandler?(false)
|
||||
}
|
||||
|
22
Veloria/Source/Assets.xcassets/icon/alert_icon_03.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "通知图标-切图图层@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "通知图标-切图图层@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
BIN
Veloria/Source/Assets.xcassets/icon/alert_icon_03.imageset/通知图标-切图图层@2x.png
vendored
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
Veloria/Source/Assets.xcassets/icon/alert_icon_03.imageset/通知图标-切图图层@3x.png
vendored
Normal file
After Width: | Height: | Size: 99 KiB |
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 5.1 KiB |
22
Veloria/Source/Assets.xcassets/icon/me_item_icon_07.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "Frame@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "Frame@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
BIN
Veloria/Source/Assets.xcassets/icon/me_item_icon_07.imageset/Frame@2x.png
vendored
Normal file
After Width: | Height: | Size: 555 B |
BIN
Veloria/Source/Assets.xcassets/icon/me_item_icon_07.imageset/Frame@3x.png
vendored
Normal file
After Width: | Height: | Size: 650 B |
@ -31,7 +31,6 @@
|
||||
"Explicit List of Personal Information Collection" = "Explicit List of Personal Information Collection";
|
||||
"About Us" = "About Us";
|
||||
"Visitor" = "Visitor";
|
||||
"Help Center" = "Help Center";
|
||||
"Feedback History" = "Feedback History";
|
||||
"Feedback" = "Feedback";
|
||||
"Feedback Details" = "Feedback Details";
|
||||
@ -73,7 +72,7 @@
|
||||
"Login with Facebook" = "Login with Facebook";
|
||||
"Log In" = "Log In";
|
||||
"Sign Out" = "Sign Out";
|
||||
"Delet Account" = "Delet Account";
|
||||
"Delete Account" = "Delete Account";
|
||||
"Account Deletion" = "Account Deletion";
|
||||
"Delete Account" = "Delete Account";
|
||||
"Delete Forever" = "Delete Forever";
|
||||
@ -89,13 +88,17 @@
|
||||
"Restore" = "Restore";
|
||||
"Watch Now" = "Watch Now";
|
||||
"More" = "More";
|
||||
"Confirm" = "Confirm";
|
||||
"Order Record" = "Order Record";
|
||||
|
||||
|
||||
"kBonusCoinCount" = "+%@ Bonus";
|
||||
"kEmptyTitle01" = "Nothing Here Yet";
|
||||
"kEmptyDes01" = "Start exploring and add something!";
|
||||
"kEmptyTitle02" = "Not Found";
|
||||
"kEmptyDes02" = "Sorry, we couldn't find anything.";
|
||||
"kDetailRecommandTitle" = "Picked Just for You";
|
||||
"kHomeTitleText" = "10,000+ addictive shorts await!";
|
||||
"kHomeTitleText" = "10,000+ Addictive Shorts Await!";
|
||||
"kSearchPlaceholderText1" = "Search dramas";
|
||||
"kSearchPlaceholderText2" = "#Recersal of fate";
|
||||
"kHomeMenuTitle" = "Select Categories";
|
||||
@ -123,6 +126,7 @@
|
||||
"kIapErrorToast02" = "Invalid in-app purchase";
|
||||
///没有可恢复购买
|
||||
"kIapErrorToast03" = "There are no in-app purchases to restore.";
|
||||
"kIapErrorToast04" = "Payment has been cancelled.";
|
||||
///请购买上一集
|
||||
"kUnlockVideoErrorToast01" = "The prequel to this series is not unlocked. Please unlock the prequel before unlocking this series";
|
||||
|
||||
@ -131,14 +135,16 @@
|
||||
"kStoreTips" = "1. Coins are virtual items and cannot be refunded. Use it for this product.
|
||||
2. Gold coins will never expire, the reward coins will expire 24 hours a day.
|
||||
3. Coins will be used first when unlocking episodes. If the amount is insufficient, reward coins will automatically be used.
|
||||
4. The purchase has not been credited, click <Restore> torefresh.
|
||||
5. For other questions, contact us via Profile>Help &feedback.";
|
||||
4. The purchase has not been credited, click <Restore> to refresh.
|
||||
5. For other questions, contact us via Me>Feedback.";
|
||||
|
||||
//请选择需要删除的短剧
|
||||
"kToastText1" = "Please select the short plays that need to be deleted";
|
||||
|
||||
"kDeleteAccountAlertTitle" = "Confirm Account Deletion";
|
||||
"kDeleteAccountAlertText" = "This action cannot be undone.";
|
||||
"kUnFavoritesAlertTitle" = "UnFavorites";
|
||||
"kUnFavoritesAlertText" = "You may not find this collection after you uncollect it";
|
||||
"kLogoutAlertTitle" = "Ready to Leave?";
|
||||
"kLogoutAlertText" = "when you sign out, your watch history will not be synced to your account.";
|
||||
|
||||
|