Commit 8255602f authored by yqz's avatar yqz

4-8

parent 784f2c41
...@@ -37,7 +37,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ...@@ -37,7 +37,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
private func setupDefault() { private func setupDefault() {
HomePayModel.share.checkTrialStatus()
NetStatusManager.manager.startNet { status in NetStatusManager.manager.startNet { status in
switch status { switch status {
......
...@@ -217,68 +217,76 @@ class CompressQualityController : BaseViewController{ ...@@ -217,68 +217,76 @@ class CompressQualityController : BaseViewController{
@objc func submitAction(){ @objc func submitAction(){
let compressingView : CompressingView = CompressingView(frame: self.view.bounds) let actionBlock = { [weak self] in
compressingView.data = self.model guard let self = self else { return }
let compressingView : CompressingView = CompressingView(frame: self.view.bounds)
self.view.addSubview(compressingView) compressingView.data = self.model
// 开始压缩 self.view.addSubview(compressingView)
let manager : CompressViewModel = CompressViewModel()
var currentQulity = 0.2 // 开始压缩
if currentQulityType == 1 { let manager : CompressViewModel = CompressViewModel()
currentQulity = 0.5 var currentQulity = 0.2
} if currentQulityType == 1 {
if currentQulityType == 2 { currentQulity = 0.5
currentQulity = 0.8 }
} if currentQulityType == 2 {
var comDataSource : [Data] = [] currentQulity = 0.8
}
if self.currentMediaType == 0 { var comDataSource : [Data] = []
// 表示压缩图片
manager.compress(assets: self.model!, compressionQuality: currentQulity) {progress in if self.currentMediaType == 0 {
compressingView.animationView.setProgress(CGFloat(progress), animated: false, duration: 0.1) // 表示压缩图片
} completion: { compressedDataArray, errorArray in manager.compress(assets: self.model!, compressionQuality: currentQulity) {progress in
var compressAllSize = 0.0 compressingView.animationView.setProgress(CGFloat(progress), animated: false, duration: 0.1)
for (index, data) in compressedDataArray.enumerated() { } completion: { compressedDataArray, errorArray in
if let error = errorArray[index] { var compressAllSize = 0.0
print("第 \(index + 1) 个文件压缩出错: \(error.localizedDescription)") for (index, data) in compressedDataArray.enumerated() {
} else if let data = data { if let error = errorArray[index] {
print("第 \(index + 1) 个文件压缩完成,压缩后大小: \(data.count) 字节") print("第 \(index + 1) 个文件压缩出错: \(error.localizedDescription)")
compressAllSize = compressAllSize + Double(data.count) } else if let data = data {
comDataSource.append(data) print("第 \(index + 1) 个文件压缩完成,压缩后大小: \(data.count) 字节")
} else { compressAllSize = compressAllSize + Double(data.count)
print("第 \(index + 1) 个文件压缩失败") comDataSource.append(data)
} else {
print("第 \(index + 1) 个文件压缩失败")
}
} }
self.updateNextView(compressAllSize,compressingView,comDataSource,[])
} }
self.updateNextView(compressAllSize,compressingView,comDataSource,[]) }else{
} // 压缩视频
}else{ var compressAllSize : Double = 0.0
// 压缩视频 manager.compressVideos(models: self.model!, quality: Float(currentQulity)) { (identifier, progress) in
var compressAllSize : Double = 0.0 compressingView.animationView.setProgress(CGFloat(progress), animated: false, duration: 0.1)
manager.compressVideos(models: self.model!, quality: Float(currentQulity)) { (identifier, progress) in } completion: { (outputURLs, errors) in
compressingView.animationView.setProgress(CGFloat(progress), animated: false, duration: 0.1) for (index, outputURL) in outputURLs.enumerated() {
} completion: { (outputURLs, errors) in if let outputURL = outputURL {
for (index, outputURL) in outputURLs.enumerated() { do {
if let outputURL = outputURL { let attributes = try FileManager.default.attributesOfItem(atPath: outputURL.path)
do { if let fileSize = attributes[.size] as? Int64 {
let attributes = try FileManager.default.attributesOfItem(atPath: outputURL.path) compressAllSize = compressAllSize + Double(fileSize)
if let fileSize = attributes[.size] as? Int64 { }
compressAllSize = compressAllSize + Double(fileSize) } catch {
Print("获取视频文件大小失败")
} }
} catch { print("Compressed video \(index) saved at: \(outputURL)")
Print("获取视频文件大小失败") } else if let error = errors[index] {
print("Error compressing video \(index): \(error.localizedDescription)")
} }
print("Compressed video \(index) saved at: \(outputURL)")
} else if let error = errors[index] {
print("Error compressing video \(index): \(error.localizedDescription)")
} }
self.updateNextView(compressAllSize,compressingView,[],outputURLs)
} }
self.updateNextView(compressAllSize,compressingView,[],outputURLs)
} }
}
}
if HomePayModel.share.isNoAd == false {
HomeNoAdsViewController.show {
actionBlock()
}
}
} }
} }
......
...@@ -58,10 +58,9 @@ class CompressNavView : UIView { ...@@ -58,10 +58,9 @@ class CompressNavView : UIView {
} }
@objc private func proBtnClick() { @objc private func proBtnClick() {
let homeNavViewModel = HomeNavViewModel() HomePayViewController.show {
let vc = HomePayViewController()
vc.modalPresentationStyle = .fullScreen }
homeNavViewModel.presentToDetailController(currentView: self, destnationController: vc)
} }
......
...@@ -56,16 +56,33 @@ class HomeInfoViewController:BaseViewController { ...@@ -56,16 +56,33 @@ class HomeInfoViewController:BaseViewController {
} }
} }
sview.deleteCallBack = {array in sview.deleteCallBack = { [weak self] array in
guard let self = self else { return }
if let cA = array as? [String] { let deleteOp:((Any)->Void) = {[weak self] imgs in
if let cA = imgs as? [String] {
PhotoAndVideoMananger.deleteAssets(localIdentifiers: cA) {[weak self] in PhotoAndVideoMananger.deleteAssets(localIdentifiers: cA) {[weak self] in
guard let self else {return}
guard let self else {return} self.tablewView.deleteModel()
}
self.tablewView.deleteModel() }
}
if HomePayModel.share.isNoAd == false {
if self.type == .duplicates { // 重复
HomePayViewController.show {
deleteOp(array)
}
}else if self.type == .similar { // 相似
HomeNoAdsViewController.show {
deleteOp(array)
}
}else{
HomeNoAdsViewController.show {
deleteOp(array)
}
} }
}else {
deleteOp(array)
} }
} }
......
...@@ -128,15 +128,9 @@ class HomeViewController:BaseViewController { ...@@ -128,15 +128,9 @@ class HomeViewController:BaseViewController {
self.navigationController?.pushViewController(vc, animated: false) self.navigationController?.pushViewController(vc, animated: false)
}else { }else {
if HomePayModel.share.isNoAd == false {
HomeNoAdsViewController.show() HomePayViewController.show {}
}
// if HomePayModel.share.isNoAd == false {
// let vc:HomePayViewController = HomePayViewController()
// let nav:BaseNavViewController = BaseNavViewController(rootViewController: vc)
// nav.modalPresentationStyle = .fullScreen
// self.navigationController?.present(nav, animated: true)
// }
} }
} }
} }
......
...@@ -85,10 +85,9 @@ class HomeNavView:UIView { ...@@ -85,10 +85,9 @@ class HomeNavView:UIView {
} }
@objc private func proBtnClick() { @objc private func proBtnClick() {
let homeNavViewModel = HomeNavViewModel() HomePayViewController.show {
let vc = HomePayViewController()
vc.modalPresentationStyle = .fullScreen }
homeNavViewModel.presentToDetailController(currentView: self, destnationController: vc)
} }
......
...@@ -6,18 +6,25 @@ ...@@ -6,18 +6,25 @@
// //
import UIKit import UIKit
import StoreKit
class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource { class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource {
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
view.backgroundColor = .white view.backgroundColor = .white
// let s = UITableView() HomePayModel.share.storeCall = {[weak self] product in
// s.delegate = self; guard let self = self else { return }
self.priceLabe?.text = "$\(product.price)/year, cancel anytime"
}
} }
private var doneBlock:(()->Void) = {}
var priceLabe:UILabel?
override func viewWillAppear(_ animated: Bool) { override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated) super.viewWillAppear(animated)
HomePayModel.share.fetchProducts()
setUI() setUI()
} }
...@@ -29,16 +36,29 @@ class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource { ...@@ -29,16 +36,29 @@ class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource {
return s return s
}() }()
private lazy var scroll: UIScrollView = {
let scroll = UIScrollView()
view.addSubview(scroll)
scroll.delegate = self;
scroll.showsHorizontalScrollIndicator = false
scroll.isPagingEnabled = true
scroll.clipsToBounds = true
return scroll
}()
private lazy var stack1:NoAdsStackView = { private lazy var stack1:NoAdsStackView = {
let s = NoAdsStackView(1) let s = NoAdsStackView(descp.count)
view.addSubview(s) scroll.addSubview(s)
s.axis = .horizontal
s.spacing = 0
s.distribution = .fillEqually
s.dataSource = self s.dataSource = self
return s return s
}() }()
private lazy var NoAdTitle: UILabel = { private lazy var NoAdTitle: UILabel = {
let no = UILabel() let no = UILabel()
no.text = "Unlock Unlimited Access" no.text = "Unlock all usage permissions"
no.font = UIFont.boldSystemFont(ofSize: 24) no.font = UIFont.boldSystemFont(ofSize: 24)
no.textAlignment = .center no.textAlignment = .center
no.numberOfLines = 0 no.numberOfLines = 0
...@@ -58,7 +78,7 @@ class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource { ...@@ -58,7 +78,7 @@ class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource {
let page = UIPageControl() let page = UIPageControl()
page.currentPageIndicatorTintColor = .colorWithHex(hexStr: "#0082FF") page.currentPageIndicatorTintColor = .colorWithHex(hexStr: "#0082FF")
page.pageIndicatorTintColor = .colorWithHex(hexStr: "#C6CEE0") page.pageIndicatorTintColor = .colorWithHex(hexStr: "#C6CEE0")
page.numberOfPages = 1 page.numberOfPages = 3
view.addSubview(page) view.addSubview(page)
return page return page
}() }()
...@@ -66,9 +86,10 @@ class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource { ...@@ -66,9 +86,10 @@ class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource {
private lazy var buybut: UIButton = { private lazy var buybut: UIButton = {
let buy = UIButton(type: .custom) let buy = UIButton(type: .custom)
buy.backgroundColor = UIColor.colorWithHex(hexStr: "#0082FF") buy.backgroundColor = UIColor.colorWithHex(hexStr: "#0082FF")
buy.setTitle("Start my 7-day free trial", for: .normal) buy.setTitle("Start my 3-day free trial", for: .normal)
buy.layer.cornerRadius = 8 buy.layer.cornerRadius = 8
view.addSubview(buy) view.addSubview(buy)
buy.addTarget(self, action: #selector(paypuase), for: .touchUpInside)
return buy return buy
}() }()
...@@ -79,29 +100,25 @@ class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource { ...@@ -79,29 +100,25 @@ class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource {
content.layer.borderWidth = 1 content.layer.borderWidth = 1
view.addSubview(content) view.addSubview(content)
let t = UILabel() let t = UILabel()
t.text = "$6.99/week, cancel anytime"
t.font = UIFont.systemFont(ofSize: 14) t.font = UIFont.systemFont(ofSize: 14)
t.textColor = .black t.textColor = .black
self.priceLabe = t;
content.addSubview(t) content.addSubview(t)
let b = UILabel() let b = UILabel()
b.text = "7-day FREE TRIAL" b.text = " 3-day FREE TRIAL"
b.font = UIFont.systemFont(ofSize: 12) b.font = UIFont.systemFont(ofSize: 12)
b.textColor = .colorWithHex(hexStr: "#666666") b.textColor = .colorWithHex(hexStr: "#666666")
content.addSubview(b)
t.snp.makeConstraints { make in t.snp.makeConstraints { make in
make.bottom.equalTo(content.centerY).offset(-2) make.bottom.equalTo(content.snp.centerY).offset(-1)
make.left.equalToSuperview().offset(10) make.left.equalToSuperview().offset(10)
} }
b.snp.makeConstraints { make in b.snp.makeConstraints { make in
make.top.equalTo(content.centerY).offset(2) make.top.equalTo(content.snp.centerY)
make.left.equalToSuperview().offset(10) make.left.equalToSuperview().offset(10)
} }
content.addSubview(b)
return content return content
}() }()
...@@ -124,9 +141,9 @@ class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource { ...@@ -124,9 +141,9 @@ class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource {
] ]
let attributedString = NSAttributedString(string: content, attributes: attributes) let attributedString = NSAttributedString(string: content, attributes: attributes)
sview.setAttributedTitle(attributedString, for: .normal) sview.setAttributedTitle(attributedString, for: .normal)
// sview.addTarget(self, action: #selector(), for: .touchUpInside) sview.addTarget(self, action: #selector(terms), for: .touchUpInside)
sview.sizeToFit() sview.sizeToFit()
view.addSubview(sview)
return sview return sview
}() }()
...@@ -149,20 +166,44 @@ class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource { ...@@ -149,20 +166,44 @@ class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource {
] ]
let attributedString = NSAttributedString(string: content, attributes: attributes) let attributedString = NSAttributedString(string: content, attributes: attributes)
sview.setAttributedTitle(attributedString, for: .normal) sview.setAttributedTitle(attributedString, for: .normal)
// sview.addTarget(self, action: #selector(), for: .touchUpInside) sview.addTarget(self, action: #selector(restore), for: .touchUpInside)
sview.sizeToFit() sview.sizeToFit()
view.addSubview(sview)
return sview return sview
}() }()
private let data:[[String:String]] = [ private let data:[[String:String]] = [
["icon":"ic_idsp_unlock","t":"Instantly Detect Similar Photos"], ["icon":"ic_idsp_unlock","t":"Intelligent cleaning of similar photos"],
["icon":"ic_naal_unlock","t":"No Ads and Limits"], ["icon":"ic_naal_unlock","t":"Unlimited usage times"],
["icon":"ic_sbst_unlock","t":"Save Both Storage & Time"], ["icon":"ic_sbst_unlock","t":"A more private space"],
]
private let descp:[String] = [
"That is great! Scan, remove similar photos, and compress videos. Simple and effective. Don't worry about the storage space decreasing",
"I have tried so many times to clean up storage on myphone but it always takes forever and never seems to beenough. This app has made it so much easier and faster",
"Thank goodness, all the storage space I use is slow.. I'm afraid of browsing and deleting unusable videos and photos, which makes things so simple"
] ]
} }
extension HomeNoAdsViewController { extension HomeNoAdsViewController : UIScrollViewDelegate {
@objc func paypuase() -> Void {
HomePayModel.share.purchase()
}
@objc func restore() -> Void {
HomePayModel.share.restore()
}
@objc func terms() -> Void {
DispatchQueue.main.async {[weak self] in
guard let self else {return}
let vc:TermOfUseWebViewController = TermOfUseWebViewController()
vc.hidesBottomBarWhenPushed = true
self.navigationController?.pushViewController(vc, animated: true)
}
}
func NoAdsStactChildView(_ content: NoAdsStackView, _ idx: Int) -> UIView { func NoAdsStactChildView(_ content: NoAdsStackView, _ idx: Int) -> UIView {
if content == stack { if content == stack {
...@@ -187,18 +228,17 @@ extension HomeNoAdsViewController { ...@@ -187,18 +228,17 @@ extension HomeNoAdsViewController {
}else if content == stack1 { }else if content == stack1 {
let stackview = UIStackView() let stackview = UIStackView()
stackview.axis = .vertical stackview.axis = .vertical
stackview.spacing = 10 stackview.spacing = 0
stackview.alignment = .center stackview.alignment = .center
stackview.distribution = .fillProportionally stackview.distribution = .fillProportionally
let label = UILabel() let label = UILabel()
label.text = "“l have a few remaining photos to \"cleanse\". Othercategories gone with great ease. So much faster than lcould do one by one!\"\nLove me now" label.text = descp[idx]
label.textAlignment = .center label.textAlignment = .center
label.numberOfLines = 0 label.numberOfLines = 0
label.textColor = .colorWithHex(hexStr: "#333333") label.textColor = .colorWithHex(hexStr: "#333333")
label.font = UIFont.boldSystemFont(ofSize: 14) label.font = UIFont.boldSystemFont(ofSize: 14)
stackview.addArrangedSubview(label) stackview.addArrangedSubview(label)
return stackview return stackview
}else{ }else{
return UIView() return UIView()
...@@ -217,9 +257,15 @@ extension HomeNoAdsViewController { ...@@ -217,9 +257,15 @@ extension HomeNoAdsViewController {
make.left.right.equalToSuperview().inset(36) make.left.right.equalToSuperview().inset(36)
make.top.equalTo(NoAdTitle.snp.bottom).offset(24) make.top.equalTo(NoAdTitle.snp.bottom).offset(24)
} }
scroll.snp.makeConstraints { make in
make.left.right.equalToSuperview().inset(30)
make.top.equalTo(stack.snp.bottom).offset(70)
make.height.equalTo(80)
}
stack1.snp.makeConstraints { make in stack1.snp.makeConstraints { make in
make.left.right.equalToSuperview().inset(36) make.left.top.equalToSuperview()
make.top.equalTo(stack.snp.bottom).offset(50) make.height.equalTo(scroll.snp.height)
make.width.equalTo(scroll.snp.width).multipliedBy(3.0)
} }
pageCtrol.snp.makeConstraints { make in pageCtrol.snp.makeConstraints { make in
make.centerX.equalToSuperview() make.centerX.equalToSuperview()
...@@ -245,21 +291,33 @@ extension HomeNoAdsViewController { ...@@ -245,21 +291,33 @@ extension HomeNoAdsViewController {
restoreBtn.snp.makeConstraints { make in restoreBtn.snp.makeConstraints { make in
make.bottom.equalToSuperview().offset(-10) make.bottom.equalToSuperview().offset(-10)
make.right.equalToSuperview().offset(15) make.right.equalToSuperview().offset(-15)
}
DispatchQueue.main.async {
self.scroll.contentSize = CGSize(width: CGRectGetWidth(self.scroll.frame) * 3.0, height: 0)
self.bottomContentView.gradient(colors: [.colorWithHex(hexStr: "#FFFFFF") , .colorWithHex(hexStr: "#E3EDFC")])
} }
self.loadViewIfNeeded() }
bottomContentView.gradient(colors: [.colorWithHex(hexStr: "#FFFFFF") , .colorWithHex(hexStr: "#E3EDFC")])
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let width = scrollView.width
let offset = scrollView.contentOffset.x
let idx = ceil(offset / width)
self.pageCtrol.currentPage = Int(idx)
} }
@objc private func closeTouch() -> Void { @objc private func closeTouch() -> Void {
self.dismiss(animated: true) self.dismiss(animated: true)
doneBlock()
} }
class func show() -> Void { class func show(_ compate:@escaping(()->Void) ) -> Void {
let vc = HomeNoAdsViewController() let vc = HomeNoAdsViewController()
vc.modalTransitionStyle = .crossDissolve vc.doneBlock = compate
vc.modalPresentationStyle = .overFullScreen let nav:BaseNavViewController = BaseNavViewController(rootViewController: vc)
guard let root = cWindow?.rootViewController else { return } nav.modalPresentationStyle = .overFullScreen
root.present(vc, animated: true) guard let root = UIViewController.topMostViewController() else { return }
root.present(nav, animated: true)
} }
} }
...@@ -29,6 +29,7 @@ class HomePayModel: NSObject ,SKProductsRequestDelegate ,SKPaymentTransactionObs ...@@ -29,6 +29,7 @@ class HomePayModel: NSObject ,SKProductsRequestDelegate ,SKPaymentTransactionObs
func checkTrialStatus() -> Void { func checkTrialStatus() -> Void {
verifyReceiptWithApple { receipt in verifyReceiptWithApple { receipt in
self.alert.dismiss()
guard let json = receipt else { guard let json = receipt else {
self.refreshReceipt() self.refreshReceipt()
return return
...@@ -76,11 +77,13 @@ class HomePayModel: NSObject ,SKProductsRequestDelegate ,SKPaymentTransactionObs ...@@ -76,11 +77,13 @@ class HomePayModel: NSObject ,SKProductsRequestDelegate ,SKPaymentTransactionObs
else { return } else { return }
let payment = SKPayment(product: prod) let payment = SKPayment(product: prod)
SKPaymentQueue.default().add(payment) SKPaymentQueue.default().add(payment)
alert.show()
} }
/** 恢复 */ /** 恢复 */
func restore() -> Void { func restore() -> Void {
SKPaymentQueue.default().restoreCompletedTransactions() SKPaymentQueue.default().restoreCompletedTransactions()
alert.show()
} }
override init() { override init() {
...@@ -88,6 +91,8 @@ class HomePayModel: NSObject ,SKProductsRequestDelegate ,SKPaymentTransactionObs ...@@ -88,6 +91,8 @@ class HomePayModel: NSObject ,SKProductsRequestDelegate ,SKPaymentTransactionObs
SKPaymentQueue.default().add(self) SKPaymentQueue.default().add(self)
} }
let alert = PMAlertView()
} }
extension HomePayModel { extension HomePayModel {
...@@ -105,6 +110,7 @@ extension HomePayModel { ...@@ -105,6 +110,7 @@ extension HomePayModel {
break break
case .failed: case .failed:
Print("购买失败") Print("购买失败")
alert.dismiss()
SKPaymentQueue.default().finishTransaction(transaction) SKPaymentQueue.default().finishTransaction(transaction)
break break
case .restored: case .restored:
......
...@@ -148,7 +148,7 @@ class HomePayView:UIView { ...@@ -148,7 +148,7 @@ class HomePayView:UIView {
} }
titleLabel1 = UILabel() titleLabel1 = UILabel()
titleLabel1?.text = "Clean your Storage" titleLabel1?.text = "Clean your storage space"
titleLabel1?.font = UIFont.systemFont(ofSize: 24, weight: .bold) titleLabel1?.font = UIFont.systemFont(ofSize: 24, weight: .bold)
titleLabel1?.textColor = UIColor.colorWithHex(hexStr: black3Color) titleLabel1?.textColor = UIColor.colorWithHex(hexStr: black3Color)
self.addSubview(titleLabel1!) self.addSubview(titleLabel1!)
...@@ -161,7 +161,7 @@ class HomePayView:UIView { ...@@ -161,7 +161,7 @@ class HomePayView:UIView {
titleLabel1?.sizeToFit() titleLabel1?.sizeToFit()
titleLabel2 = UILabel() titleLabel2 = UILabel()
titleLabel2?.text = "Get rid of what you don't need" titleLabel2?.text = "Delete unnecessary content"
titleLabel2?.font = UIFont.systemFont(ofSize: 14, weight: .bold) titleLabel2?.font = UIFont.systemFont(ofSize: 14, weight: .bold)
titleLabel2?.textColor = UIColor.colorWithHex(hexStr: black3Color) titleLabel2?.textColor = UIColor.colorWithHex(hexStr: black3Color)
self.addSubview(titleLabel2!) self.addSubview(titleLabel2!)
...@@ -287,7 +287,7 @@ class HomePayView:UIView { ...@@ -287,7 +287,7 @@ class HomePayView:UIView {
} }
contentView1Tip1 = UILabel() contentView1Tip1 = UILabel()
contentView1Tip1?.text = "Smart Cleaning, Video Compressor, Secret Storage, Manage Contacts, No Ads and Limits." contentView1Tip1?.text = "Smart Cleaning, Video Compressor, Secret Storage, No Ads and Limits."
contentView1Tip1?.font = UIFont.systemFont(ofSize: 12, weight: .regular) contentView1Tip1?.font = UIFont.systemFont(ofSize: 12, weight: .regular)
contentView1Tip1?.textColor = UIColor.colorWithHex(hexStr: black6Color) contentView1Tip1?.textColor = UIColor.colorWithHex(hexStr: black6Color)
contentView1Tip1?.numberOfLines = 2 contentView1Tip1?.numberOfLines = 2
...@@ -303,7 +303,6 @@ class HomePayView:UIView { ...@@ -303,7 +303,6 @@ class HomePayView:UIView {
contentView1Tip1?.setlineSpacing(font: contentView1Tip1!.font, lineSpacing: 3, width: contentView1Tip1!.width, numberOfLines: contentView1Tip1!.numberOfLines, content: contentView1Tip1!.text ?? "") contentView1Tip1?.setlineSpacing(font: contentView1Tip1!.font, lineSpacing: 3, width: contentView1Tip1!.width, numberOfLines: contentView1Tip1!.numberOfLines, content: contentView1Tip1!.text ?? "")
contentView1Tip2 = UILabel() contentView1Tip2 = UILabel()
contentView1Tip2?.text = "Free for 7 days, then $6.99/week"
contentView1Tip2?.font = UIFont.systemFont(ofSize: 12, weight: .regular) contentView1Tip2?.font = UIFont.systemFont(ofSize: 12, weight: .regular)
contentView1Tip2?.textColor = UIColor.colorWithHex(hexStr: black6Color) contentView1Tip2?.textColor = UIColor.colorWithHex(hexStr: black6Color)
contentView1Tip2?.numberOfLines = 1 contentView1Tip2?.numberOfLines = 1
...@@ -454,7 +453,7 @@ class HomePayView:UIView { ...@@ -454,7 +453,7 @@ class HomePayView:UIView {
}) })
freeContentTip = UILabel() freeContentTip = UILabel()
freeContentTip?.text = "7 days free" freeContentTip?.text = "3 days free"
freeContentTip?.font = UIFont.systemFont(ofSize: 12, weight: .bold) freeContentTip?.font = UIFont.systemFont(ofSize: 12, weight: .bold)
freeContentTip?.textColor = UIColor.colorWithHex(hexStr: whiteColor) freeContentTip?.textColor = UIColor.colorWithHex(hexStr: whiteColor)
freeContentTip?.backgroundColor = UIColor.colorWithHex(hexStr: "#52C776") freeContentTip?.backgroundColor = UIColor.colorWithHex(hexStr: "#52C776")
...@@ -483,7 +482,8 @@ class HomePayView:UIView { ...@@ -483,7 +482,8 @@ class HomePayView:UIView {
}) })
normalContentTitle = UILabel() normalContentTitle = UILabel()
normalContentTitle?.text = "Due today" let date:String = Date().operation(1)?.string("MMMM dd yyyy") ?? ""
normalContentTitle?.text = "Due \(date)"
normalContentTitle?.font = UIFont.systemFont(ofSize: 12, weight: .regular) normalContentTitle?.font = UIFont.systemFont(ofSize: 12, weight: .regular)
normalContentTitle?.textColor = UIColor.colorWithHex(hexStr: black6Color) normalContentTitle?.textColor = UIColor.colorWithHex(hexStr: black6Color)
normalContent?.addSubview(normalContentTitle!) normalContent?.addSubview(normalContentTitle!)
...@@ -523,6 +523,7 @@ class HomePayView:UIView { ...@@ -523,6 +523,7 @@ class HomePayView:UIView {
didSet{ didSet{
guard let prod = product else { return } guard let prod = product else { return }
normalContentMoney?.text = "$\(prod.price)" normalContentMoney?.text = "$\(prod.price)"
contentView1Tip2?.text = "Free trial for 3 days, $\(prod.price) per year thereafter"
} }
} }
......
...@@ -14,6 +14,8 @@ class HomePayViewController:UIViewController { ...@@ -14,6 +14,8 @@ class HomePayViewController:UIViewController {
private var homePayView:HomePayView? private var homePayView:HomePayView?
private var disjunctor = false private var disjunctor = false
private var doneBlock:(()->Void) = {}
var currentProduct:SKProduct? { var currentProduct:SKProduct? {
didSet { didSet {
setPrice() setPrice()
...@@ -49,6 +51,7 @@ class HomePayViewController:UIViewController { ...@@ -49,6 +51,7 @@ class HomePayViewController:UIViewController {
switch operstatus { switch operstatus {
case .close: case .close:
self.dismiss(animated: true) self.dismiss(animated: true)
doneBlock()
default: default:
break break
} }
...@@ -122,4 +125,14 @@ extension HomePayViewController { ...@@ -122,4 +125,14 @@ extension HomePayViewController {
private func restoreClick() { private func restoreClick() {
HomePayModel.share.restore() HomePayModel.share.restore()
} }
class func show( _ compate:@escaping(()->Void)) -> Void {
let vc:HomePayViewController = HomePayViewController()
vc.doneBlock = compate
let nav:BaseNavViewController = BaseNavViewController(rootViewController: vc)
nav.modalPresentationStyle = .fullScreen
guard let rt = UIViewController.topMostViewController() else { return }
rt.present(nav, animated: true)
}
} }
...@@ -112,10 +112,10 @@ class SettingViewHeaderCell : UITableViewCell { ...@@ -112,10 +112,10 @@ class SettingViewHeaderCell : UITableViewCell {
} }
@objc func leanMoreBtnClick() { @objc func leanMoreBtnClick() {
let homeNavViewModel = HomeNavViewModel()
let vc = HomePayViewController() HomeNoAdsViewController.show {
vc.modalPresentationStyle = .fullScreen
homeNavViewModel.presentToDetailController(currentView: self, destnationController: vc) }
} }
} }
...@@ -180,7 +180,7 @@ class SettingViewController : BaseViewController , UITableViewDelegate, UITableV ...@@ -180,7 +180,7 @@ class SettingViewController : BaseViewController , UITableViewDelegate, UITableV
} }
private func PhoneShare() -> Void { private func PhoneShare() -> Void {
let items: [Any] = [ URL(string: "https://www.baidu.com")!] let items: [Any] = [ URL(string: "itms-apps://itunes.apple.com/app/id1530333201")! ]
let shareVc = UIActivityViewController( let shareVc = UIActivityViewController(
activityItems: items, activityItems: items,
applicationActivities: nil applicationActivities: nil
......
//
// PMAlertView.swift
// PhoneManager
//
// Created by edy on 2025/4/8.
//
import UIKit
class PMAlertView: NSObject {
private var pm_t:String?
private var pm_msg:String?
func show() -> Void {
DispatchQueue.main.async {
guard let rt = UIViewController.topMostViewController() else { return }
self.pmAlert.view.addSubview(self.pm_ActivityIndicator)
self.pm_ActivityIndicator.snp.makeConstraints { make in
make.centerY.centerX.equalToSuperview()
}
rt.present(self.pmAlert, animated: true)
}
}
func dismiss() -> Void {
DispatchQueue.main.async {
self.pmAlert.dismiss(animated: true)
}
}
convenience init(_ title:String?, _ message:String?) {
self.init()
self.pm_t = title
self.pm_msg = message
}
private lazy var pmAlert: UIAlertController = {
let pm = UIAlertController(title: "", message: pm_msg, preferredStyle: .alert)
return pm
}()
private lazy var pm_ActivityIndicator: UIActivityIndicatorView = {
let pmact = UIActivityIndicatorView()
pmact.style = .medium
pmact.startAnimating()
return pmact
}()
}
...@@ -214,3 +214,33 @@ enum GradientDirection { ...@@ -214,3 +214,33 @@ enum GradientDirection {
} }
} }
} }
extension Date {
func string(_ format:String = "") -> String {
let dateforametter = DateFormatter()
dateforametter.dateFormat = format
return dateforametter.string(from: self)
}
func operation(_ year:Int = 0,
_ month:Int = 0,
_ day:Int = 0,
_ houre:Int = 0,
_ minte:Int = 0,
_ sec:Int = 0,
_ week:Int = 0) -> Date? {
let calendar = Calendar.current
let currentDate = self
var dateComponent:DateComponents = calendar.dateComponents([.year,.month,.day,.hour,.minute,.second,.weekday], from: currentDate)
dateComponent.year! += year
dateComponent.month! += month
dateComponent.month! += day
dateComponent.hour! += houre
dateComponent.second! += sec
dateComponent.weekday! += week
guard let toDate = calendar.date(from: dateComponent) else { return self }
return toDate
}
}
...@@ -23,5 +23,40 @@ extension UIViewController { ...@@ -23,5 +23,40 @@ extension UIViewController {
nav.barHidden = isHidden nav.barHidden = isHidden
} }
class func topMostViewController() -> UIViewController? {
guard let rootViewController = UIApplication.shared.keyWindow?.rootViewController else {
return nil
}
return self.topMostViewController(of: rootViewController)
}
private static func topMostViewController(of viewController: UIViewController) -> UIViewController {
// 处理模态弹出的视图控制器
if let presentedViewController = viewController.presentedViewController {
return self.topMostViewController(of: presentedViewController)
}
// 处理 UINavigationController
if let navigationController = viewController as? UINavigationController,
let visibleViewController = navigationController.visibleViewController {
return self.topMostViewController(of: visibleViewController)
}
// 处理 UITabBarController
if let tabBarController = viewController as? UITabBarController,
let selectedViewController = tabBarController.selectedViewController {
return self.topMostViewController(of: selectedViewController)
}
// 处理子控制器
for subview in viewController.view?.subviews ?? [] {
if let childViewController = subview.next as? UIViewController {
return self.topMostViewController(of: childViewController)
}
}
return viewController
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment