Commit 8255602f authored by yqz's avatar yqz

4-8

parent 784f2c41
......@@ -37,7 +37,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
private func setupDefault() {
HomePayModel.share.checkTrialStatus()
NetStatusManager.manager.startNet { status in
switch status {
......
......@@ -217,68 +217,76 @@ class CompressQualityController : BaseViewController{
@objc func submitAction(){
let compressingView : CompressingView = CompressingView(frame: self.view.bounds)
compressingView.data = self.model
self.view.addSubview(compressingView)
// 开始压缩
let manager : CompressViewModel = CompressViewModel()
var currentQulity = 0.2
if currentQulityType == 1 {
currentQulity = 0.5
}
if currentQulityType == 2 {
currentQulity = 0.8
}
var comDataSource : [Data] = []
if self.currentMediaType == 0 {
// 表示压缩图片
manager.compress(assets: self.model!, compressionQuality: currentQulity) {progress in
compressingView.animationView.setProgress(CGFloat(progress), animated: false, duration: 0.1)
} completion: { compressedDataArray, errorArray in
var compressAllSize = 0.0
for (index, data) in compressedDataArray.enumerated() {
if let error = errorArray[index] {
print("第 \(index + 1) 个文件压缩出错: \(error.localizedDescription)")
} else if let data = data {
print("第 \(index + 1) 个文件压缩完成,压缩后大小: \(data.count) 字节")
compressAllSize = compressAllSize + Double(data.count)
comDataSource.append(data)
} else {
print("第 \(index + 1) 个文件压缩失败")
let actionBlock = { [weak self] in
guard let self = self else { return }
let compressingView : CompressingView = CompressingView(frame: self.view.bounds)
compressingView.data = self.model
self.view.addSubview(compressingView)
// 开始压缩
let manager : CompressViewModel = CompressViewModel()
var currentQulity = 0.2
if currentQulityType == 1 {
currentQulity = 0.5
}
if currentQulityType == 2 {
currentQulity = 0.8
}
var comDataSource : [Data] = []
if self.currentMediaType == 0 {
// 表示压缩图片
manager.compress(assets: self.model!, compressionQuality: currentQulity) {progress in
compressingView.animationView.setProgress(CGFloat(progress), animated: false, duration: 0.1)
} completion: { compressedDataArray, errorArray in
var compressAllSize = 0.0
for (index, data) in compressedDataArray.enumerated() {
if let error = errorArray[index] {
print("第 \(index + 1) 个文件压缩出错: \(error.localizedDescription)")
} else if let data = data {
print("第 \(index + 1) 个文件压缩完成,压缩后大小: \(data.count) 字节")
compressAllSize = compressAllSize + Double(data.count)
comDataSource.append(data)
} else {
print("第 \(index + 1) 个文件压缩失败")
}
}
self.updateNextView(compressAllSize,compressingView,comDataSource,[])
}
self.updateNextView(compressAllSize,compressingView,comDataSource,[])
}
}else{
// 压缩视频
var compressAllSize : Double = 0.0
manager.compressVideos(models: self.model!, quality: Float(currentQulity)) { (identifier, progress) in
compressingView.animationView.setProgress(CGFloat(progress), animated: false, duration: 0.1)
} completion: { (outputURLs, errors) in
for (index, outputURL) in outputURLs.enumerated() {
if let outputURL = outputURL {
do {
let attributes = try FileManager.default.attributesOfItem(atPath: outputURL.path)
if let fileSize = attributes[.size] as? Int64 {
compressAllSize = compressAllSize + Double(fileSize)
}else{
// 压缩视频
var compressAllSize : Double = 0.0
manager.compressVideos(models: self.model!, quality: Float(currentQulity)) { (identifier, progress) in
compressingView.animationView.setProgress(CGFloat(progress), animated: false, duration: 0.1)
} completion: { (outputURLs, errors) in
for (index, outputURL) in outputURLs.enumerated() {
if let outputURL = outputURL {
do {
let attributes = try FileManager.default.attributesOfItem(atPath: outputURL.path)
if let fileSize = attributes[.size] as? Int64 {
compressAllSize = compressAllSize + Double(fileSize)
}
} catch {
Print("获取视频文件大小失败")
}
} catch {
Print("获取视频文件大小失败")
print("Compressed video \(index) saved at: \(outputURL)")
} 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 {
}
@objc private func proBtnClick() {
let homeNavViewModel = HomeNavViewModel()
let vc = HomePayViewController()
vc.modalPresentationStyle = .fullScreen
homeNavViewModel.presentToDetailController(currentView: self, destnationController: vc)
HomePayViewController.show {
}
}
......
......@@ -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] {
PhotoAndVideoMananger.deleteAssets(localIdentifiers: cA) {[weak self] in
guard let self else {return}
self.tablewView.deleteModel()
let deleteOp:((Any)->Void) = {[weak self] imgs in
if let cA = imgs as? [String] {
PhotoAndVideoMananger.deleteAssets(localIdentifiers: cA) {[weak self] in
guard let self else {return}
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 {
self.navigationController?.pushViewController(vc, animated: false)
}else {
HomeNoAdsViewController.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)
// }
if HomePayModel.share.isNoAd == false {
HomePayViewController.show {}
}
}
}
}
......
......@@ -85,10 +85,9 @@ class HomeNavView:UIView {
}
@objc private func proBtnClick() {
let homeNavViewModel = HomeNavViewModel()
let vc = HomePayViewController()
vc.modalPresentationStyle = .fullScreen
homeNavViewModel.presentToDetailController(currentView: self, destnationController: vc)
HomePayViewController.show {
}
}
......
......@@ -6,18 +6,25 @@
//
import UIKit
import StoreKit
class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
// let s = UITableView()
// s.delegate = self;
HomePayModel.share.storeCall = {[weak self] product in
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) {
super.viewWillAppear(animated)
HomePayModel.share.fetchProducts()
setUI()
}
......@@ -29,16 +36,29 @@ class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource {
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 = {
let s = NoAdsStackView(1)
view.addSubview(s)
let s = NoAdsStackView(descp.count)
scroll.addSubview(s)
s.axis = .horizontal
s.spacing = 0
s.distribution = .fillEqually
s.dataSource = self
return s
}()
private lazy var NoAdTitle: UILabel = {
let no = UILabel()
no.text = "Unlock Unlimited Access"
no.text = "Unlock all usage permissions"
no.font = UIFont.boldSystemFont(ofSize: 24)
no.textAlignment = .center
no.numberOfLines = 0
......@@ -58,7 +78,7 @@ class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource {
let page = UIPageControl()
page.currentPageIndicatorTintColor = .colorWithHex(hexStr: "#0082FF")
page.pageIndicatorTintColor = .colorWithHex(hexStr: "#C6CEE0")
page.numberOfPages = 1
page.numberOfPages = 3
view.addSubview(page)
return page
}()
......@@ -66,9 +86,10 @@ class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource {
private lazy var buybut: UIButton = {
let buy = UIButton(type: .custom)
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
view.addSubview(buy)
buy.addTarget(self, action: #selector(paypuase), for: .touchUpInside)
return buy
}()
......@@ -79,29 +100,25 @@ class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource {
content.layer.borderWidth = 1
view.addSubview(content)
let t = UILabel()
t.text = "$6.99/week, cancel anytime"
t.font = UIFont.systemFont(ofSize: 14)
t.textColor = .black
self.priceLabe = t;
content.addSubview(t)
let b = UILabel()
b.text = "7-day FREE TRIAL"
b.text = " 3-day FREE TRIAL"
b.font = UIFont.systemFont(ofSize: 12)
b.textColor = .colorWithHex(hexStr: "#666666")
content.addSubview(b)
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)
}
b.snp.makeConstraints { make in
make.top.equalTo(content.centerY).offset(2)
make.top.equalTo(content.snp.centerY)
make.left.equalToSuperview().offset(10)
}
content.addSubview(b)
return content
}()
......@@ -124,9 +141,9 @@ class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource {
]
let attributedString = NSAttributedString(string: content, attributes: attributes)
sview.setAttributedTitle(attributedString, for: .normal)
// sview.addTarget(self, action: #selector(), for: .touchUpInside)
sview.addTarget(self, action: #selector(terms), for: .touchUpInside)
sview.sizeToFit()
view.addSubview(sview)
return sview
}()
......@@ -149,20 +166,44 @@ class HomeNoAdsViewController: UIViewController, NoAdsStackDataSource {
]
let attributedString = NSAttributedString(string: content, attributes: attributes)
sview.setAttributedTitle(attributedString, for: .normal)
// sview.addTarget(self, action: #selector(), for: .touchUpInside)
sview.addTarget(self, action: #selector(restore), for: .touchUpInside)
sview.sizeToFit()
view.addSubview(sview)
return sview
}()
private let data:[[String:String]] = [
["icon":"ic_idsp_unlock","t":"Instantly Detect Similar Photos"],
["icon":"ic_naal_unlock","t":"No Ads and Limits"],
["icon":"ic_sbst_unlock","t":"Save Both Storage & Time"],
["icon":"ic_idsp_unlock","t":"Intelligent cleaning of similar photos"],
["icon":"ic_naal_unlock","t":"Unlimited usage times"],
["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 {
if content == stack {
......@@ -187,18 +228,17 @@ extension HomeNoAdsViewController {
}else if content == stack1 {
let stackview = UIStackView()
stackview.axis = .vertical
stackview.spacing = 10
stackview.spacing = 0
stackview.alignment = .center
stackview.distribution = .fillProportionally
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.numberOfLines = 0
label.textColor = .colorWithHex(hexStr: "#333333")
label.font = UIFont.boldSystemFont(ofSize: 14)
stackview.addArrangedSubview(label)
return stackview
}else{
return UIView()
......@@ -217,9 +257,15 @@ extension HomeNoAdsViewController {
make.left.right.equalToSuperview().inset(36)
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
make.left.right.equalToSuperview().inset(36)
make.top.equalTo(stack.snp.bottom).offset(50)
make.left.top.equalToSuperview()
make.height.equalTo(scroll.snp.height)
make.width.equalTo(scroll.snp.width).multipliedBy(3.0)
}
pageCtrol.snp.makeConstraints { make in
make.centerX.equalToSuperview()
......@@ -245,21 +291,33 @@ extension HomeNoAdsViewController {
restoreBtn.snp.makeConstraints { make in
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 {
self.dismiss(animated: true)
doneBlock()
}
class func show() -> Void {
class func show(_ compate:@escaping(()->Void) ) -> Void {
let vc = HomeNoAdsViewController()
vc.modalTransitionStyle = .crossDissolve
vc.modalPresentationStyle = .overFullScreen
guard let root = cWindow?.rootViewController else { return }
root.present(vc, animated: true)
vc.doneBlock = compate
let nav:BaseNavViewController = BaseNavViewController(rootViewController: vc)
nav.modalPresentationStyle = .overFullScreen
guard let root = UIViewController.topMostViewController() else { return }
root.present(nav, animated: true)
}
}
......@@ -29,6 +29,7 @@ class HomePayModel: NSObject ,SKProductsRequestDelegate ,SKPaymentTransactionObs
func checkTrialStatus() -> Void {
verifyReceiptWithApple { receipt in
self.alert.dismiss()
guard let json = receipt else {
self.refreshReceipt()
return
......@@ -76,11 +77,13 @@ class HomePayModel: NSObject ,SKProductsRequestDelegate ,SKPaymentTransactionObs
else { return }
let payment = SKPayment(product: prod)
SKPaymentQueue.default().add(payment)
alert.show()
}
/** 恢复 */
func restore() -> Void {
SKPaymentQueue.default().restoreCompletedTransactions()
alert.show()
}
override init() {
......@@ -88,6 +91,8 @@ class HomePayModel: NSObject ,SKProductsRequestDelegate ,SKPaymentTransactionObs
SKPaymentQueue.default().add(self)
}
let alert = PMAlertView()
}
extension HomePayModel {
......@@ -105,6 +110,7 @@ extension HomePayModel {
break
case .failed:
Print("购买失败")
alert.dismiss()
SKPaymentQueue.default().finishTransaction(transaction)
break
case .restored:
......
......@@ -148,7 +148,7 @@ class HomePayView:UIView {
}
titleLabel1 = UILabel()
titleLabel1?.text = "Clean your Storage"
titleLabel1?.text = "Clean your storage space"
titleLabel1?.font = UIFont.systemFont(ofSize: 24, weight: .bold)
titleLabel1?.textColor = UIColor.colorWithHex(hexStr: black3Color)
self.addSubview(titleLabel1!)
......@@ -161,7 +161,7 @@ class HomePayView:UIView {
titleLabel1?.sizeToFit()
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?.textColor = UIColor.colorWithHex(hexStr: black3Color)
self.addSubview(titleLabel2!)
......@@ -287,7 +287,7 @@ class HomePayView:UIView {
}
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?.textColor = UIColor.colorWithHex(hexStr: black6Color)
contentView1Tip1?.numberOfLines = 2
......@@ -303,7 +303,6 @@ class HomePayView:UIView {
contentView1Tip1?.setlineSpacing(font: contentView1Tip1!.font, lineSpacing: 3, width: contentView1Tip1!.width, numberOfLines: contentView1Tip1!.numberOfLines, content: contentView1Tip1!.text ?? "")
contentView1Tip2 = UILabel()
contentView1Tip2?.text = "Free for 7 days, then $6.99/week"
contentView1Tip2?.font = UIFont.systemFont(ofSize: 12, weight: .regular)
contentView1Tip2?.textColor = UIColor.colorWithHex(hexStr: black6Color)
contentView1Tip2?.numberOfLines = 1
......@@ -454,7 +453,7 @@ class HomePayView:UIView {
})
freeContentTip = UILabel()
freeContentTip?.text = "7 days free"
freeContentTip?.text = "3 days free"
freeContentTip?.font = UIFont.systemFont(ofSize: 12, weight: .bold)
freeContentTip?.textColor = UIColor.colorWithHex(hexStr: whiteColor)
freeContentTip?.backgroundColor = UIColor.colorWithHex(hexStr: "#52C776")
......@@ -483,7 +482,8 @@ class HomePayView:UIView {
})
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?.textColor = UIColor.colorWithHex(hexStr: black6Color)
normalContent?.addSubview(normalContentTitle!)
......@@ -523,6 +523,7 @@ class HomePayView:UIView {
didSet{
guard let prod = product else { return }
normalContentMoney?.text = "$\(prod.price)"
contentView1Tip2?.text = "Free trial for 3 days, $\(prod.price) per year thereafter"
}
}
......
......@@ -14,6 +14,8 @@ class HomePayViewController:UIViewController {
private var homePayView:HomePayView?
private var disjunctor = false
private var doneBlock:(()->Void) = {}
var currentProduct:SKProduct? {
didSet {
setPrice()
......@@ -49,6 +51,7 @@ class HomePayViewController:UIViewController {
switch operstatus {
case .close:
self.dismiss(animated: true)
doneBlock()
default:
break
}
......@@ -122,4 +125,14 @@ extension HomePayViewController {
private func restoreClick() {
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 {
}
@objc func leanMoreBtnClick() {
let homeNavViewModel = HomeNavViewModel()
let vc = HomePayViewController()
vc.modalPresentationStyle = .fullScreen
homeNavViewModel.presentToDetailController(currentView: self, destnationController: vc)
HomeNoAdsViewController.show {
}
}
}
......@@ -180,7 +180,7 @@ class SettingViewController : BaseViewController , UITableViewDelegate, UITableV
}
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(
activityItems: items,
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 {
}
}
}
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 {
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