Commit d8fd3bc7 authored by CZ1004's avatar CZ1004

压缩页面,设置页面开发

parent ca8a7ef1
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "ic_cmpress_home_nor.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "ic_cmpress_home_nor@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "ic_cmpress_home_nor@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "ic_compressed_end.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "ic_compressed_end@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "ic_compressed_end@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "ic_freed_end.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "ic_freed_end@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "ic_freed_end@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "ic_newest_similar.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "ic_newest_similar@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "ic_newest_similar@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "ic_sel_com.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "ic_sel_com@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "ic_sel_com@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "ic_unsel_com.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "ic_unsel_com@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "ic_unsel_com@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "icon_left_setting_grey.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "icon_left_setting_grey@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "icon_left_setting_grey@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
//
// CompressController.swift
// PhoneManager
//
// Created by edy on 2025/4/2.
//
import Foundation
import SnapKit
import Photos
class CompressController : BaseViewController {
private var compressNav:CompressNavView?
var modeData = [ResourceModel](){
didSet{
DispatchQueue.main.async {
self.collectionView.reloadData()
}
}
}
func getData(){
let source :[PHAsset] = ResourceManager.manager.getAllPhotosByPHAsset()
for asset in source{
let options = PHImageRequestOptions()
options.isSynchronous = false
options.deliveryMode = .highQualityFormat
PHImageManager.default().requestImageDataAndOrientation(for: asset, options: options) { (imageData, _, _, _) in
guard let imageData else {return}
// 这里还需要计算下可以压缩的大小
let model = ResourceModel(ident: asset.localIdentifier, saveSize: imageData.count, orgSize: imageData.count,choose: false)
self.modeData.append(model)
}
}
}
lazy var collectionView:UICollectionView = {
let layout = WaterfallMutiSectionFlowLayout()
layout.delegate = self
let sview:UICollectionView = UICollectionView.init(frame: CGRect(x: marginLR, y: self.compressNav!.height, width: self.view.width - 2 * marginLR, height: self.view.height - self.compressNav!.height - 102), collectionViewLayout: layout)
sview.register(CompressSelectCell.self, forCellWithReuseIdentifier: "CompressSelectCell")
sview.register(CompressCustomHeaderView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "CompressCustomHeaderView")
sview.register( UICollectionReusableView.self,forSupplementaryViewOfKind: UICollectionView.elementKindSectionFooter,withReuseIdentifier: "footerID")
sview.dataSource = self
sview.delegate = self
sview.showsVerticalScrollIndicator = false
if #available(iOS 11.0, *) {
sview.contentInsetAdjustmentBehavior = .never
}
sview.backgroundColor = .clear
return sview
}()
lazy var submitButton : UIButton = {
let view = UIButton()
view.backgroundColor = UIColor(red: 0.7, green: 0.7, blue: 0.7, alpha: 1)
view.setTitle("Compress", for: UIControl.State.normal)
view.setTitleColor(UIColor(red: 1, green: 1, blue: 1, alpha: 1), for: .normal)
view.clipsToBounds = true
view.layer.cornerRadius = 23
view.backgroundColor = UIColor(red: 0.7, green: 0.7, blue: 0.7, alpha: 1)
return view
}()
func setUI(){
compressNav = CompressNavView(frame: CGRect(x: 0, y: 0, width: self.view.width, height: statusBarHeight + 44))
self.view.addSubview(compressNav!)
compressNav?.snp.makeConstraints({ make in
make.top.centerX.width.equalToSuperview()
make.height.equalTo(statusBarHeight + 44)
})
self.view.insertSubview(collectionView, at: 0)
self.view.addSubview(self.submitButton)
self.submitButton.snp.makeConstraints { make in
make.top.equalTo(self.collectionView.snp.bottom).offset(16)
make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15)
make.height.equalTo(46)
}
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
self.navigationController?.navigationBar.isHidden = true
setUI()
getData()
}
}
extension CompressController:WaterfallMutiSectionDelegate,UICollectionViewDataSource,UICollectionViewDelegate {
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.modeData.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CompressSelectCell", for: indexPath) as! CompressSelectCell
cell.model = self.modeData[indexPath.row]
cell.callBack = {[weak self] (model:ResourceModel,choose:Bool) ->() in
let vc : CompressQualityController = CompressQualityController()
vc.model = model
self?.navigationController?.pushViewController(vc, animated: true)
}
return cell
}
func heightForRowAtIndexPath(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, indexPath: IndexPath, itemWidth: CGFloat) -> CGFloat {
if indexPath.row % 2 == 0{
return itemWidth
}
return itemWidth + 67
}
func columnNumber(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> Int {
return 2
}
func lineSpacing(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> CGFloat {
return 8
}
func interitemSpacing(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> CGFloat {
return 11
}
func spacingWithLastSection(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> CGFloat {
return 8
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
}
func referenceSizeForHeader(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> CGSize {
return CGSize (width: self.collectionView.width, height: 188)
}
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
if kind == UICollectionView.elementKindSectionHeader {
let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "CompressCustomHeaderView", for: indexPath) as! CompressCustomHeaderView
header.modeData = self.modeData
return header
}else{
let footer = collectionView.dequeueReusableSupplementaryView(
ofKind: kind,
withReuseIdentifier: "footerID",
for: indexPath
)
return footer
}
}
}
//
// CompressQualityController.swift
// PhoneManager
//
// Created by edy on 2025/4/2.
//
import Foundation
class CompressQualityController : BaseViewController{
var model : ResourceModel? {
didSet{
let image = PhotoAndVideoMananger.mananger.getImageFromAssetID(id: model!.ident)
self.imageView.image = image
}
}
private var compressNav:CompressNavView?
lazy var imageView: UIImageView = {
let imageView = UIImageView()
imageView.clipsToBounds = true
imageView.layer.cornerRadius = 12
imageView.backgroundColor = .clear
return imageView
}()
lazy var tipLabel: UILabel = {
let label = UILabel()
label.text = "Select photo quality after compression"
label.textAlignment = .left
label.font = UIFont.systemFont(ofSize: 16, weight: .bold)
label.backgroundColor = .clear
return label
}()
lazy var detailTiplabel: UILabel = {
let label = UILabel()
label.text = "You've selected 2 out of 253 photos to compress."
label.textAlignment = .left
label.font = UIFont.systemFont(ofSize: 12, weight: .regular)
label.backgroundColor = .clear
return label
}()
lazy var lowQualityView: QualityView = {
let view = QualityView()
view.selectedImageView.image = UIImage(named: "ic_unsel_com")
return view
}()
lazy var mediumQualityView: QualityView = {
let view = QualityView()
view.tipLabel.text = "Medium quality"
view.detailTiplabel.text = "Compress up to 50% of the size"
return view
}()
lazy var highQualityView: QualityView = {
let view = QualityView()
view.tipLabel.text = "High quality"
view.detailTiplabel.text = "Compress up to 20% of the size"
return view
}()
lazy var submitButton : UIButton = {
let view = UIButton()
view.setTitle("Compress", for: UIControl.State.normal)
view.setTitleColor(UIColor(red: 1, green: 1, blue: 1, alpha: 1), for: .normal)
view.clipsToBounds = true
view.layer.cornerRadius = 23
view.backgroundColor = UIColor(red: 0, green: 0.51, blue: 1, alpha: 1)
view.addTarget(self, action: #selector(submitAction), for: .touchUpInside)
return view
}()
func setUI(){
compressNav = CompressNavView(frame: CGRect(x: 0, y: 0, width: self.view.width, height: statusBarHeight + 44))
self.view.addSubview(compressNav!)
compressNav?.snp.makeConstraints({ make in
make.top.centerX.width.equalToSuperview()
make.height.equalTo(statusBarHeight + 44)
})
self.view.addSubview(self.imageView)
self.view.addSubview(self.tipLabel)
self.view.addSubview(self.detailTiplabel)
self.view.addSubview(self.lowQualityView)
self.view.addSubview(self.mediumQualityView)
self.view.addSubview(self.highQualityView)
self.view.addSubview(self.submitButton)
self.imageView.snp.makeConstraints { make in
make.top.equalTo(self.compressNav!.height + 20)
make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15)
make.height.equalTo(259)
}
self.tipLabel.snp.makeConstraints { make in
make.top.equalTo(self.imageView.snp.bottom).offset(28)
make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15)
make.height.equalTo(22)
}
self.detailTiplabel.snp.makeConstraints { make in
make.top.equalTo(self.tipLabel.snp.bottom).offset(4)
make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15)
make.height.equalTo(17)
}
self.lowQualityView.snp.makeConstraints { make in
make.top.equalTo(self.detailTiplabel.snp.bottom).offset(16)
make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15)
make.height.equalTo(61)
}
self.mediumQualityView.snp.makeConstraints { make in
make.top.equalTo(self.lowQualityView.snp.bottom).offset(12)
make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15)
make.height.equalTo(61)
}
self.highQualityView.snp.makeConstraints { make in
make.top.equalTo(self.mediumQualityView.snp.bottom).offset(12)
make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15)
make.height.equalTo(61)
}
self.submitButton.snp.makeConstraints { make in
make.bottom.equalTo(-40)
make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15)
make.height.equalTo(46)
}
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
self.navigationController?.navigationBar.isHidden = true
setUI()
}
@objc func submitAction(){
let compressingView : CompressingView = CompressingView(frame: self.view.bounds)
self.view.addSubview(compressingView)
let queue = DispatchQueue.global()
let delayTime = DispatchTime.now() + 3.0
queue.asyncAfter(deadline: delayTime) {
DispatchQueue.main.async {
compressingView.removeFromSuperview()
let vc = CompressCompletedViewController()
self.navigationController?.pushViewController(vc, animated: true)
}
}
}
}
//
// ResourceModel.swift
// PhoneManager
//
// Created by edy on 2025/4/2.
//
import Foundation
struct ResourceModel {
var ident : String
var saveSize : Int
var orgSize: Int
var choose : Bool
init(ident: String, saveSize: Int, orgSize: Int, choose: Bool) {
self.ident = ident
self.saveSize = saveSize
self.orgSize = orgSize
self.choose = choose
}
}
//
// CompressSelectCell.swift
// PhoneManager
//
// Created by edy on 2025/4/2.
//
import Foundation
typealias CompressSelectCellCallback = (ResourceModel,Bool)->Void
class CompressSelectCell : UICollectionViewCell {
var callBack : CompressSelectCellCallback = {model,choose in}
var model : ResourceModel? {
didSet{
guard let model = self.model else {return}
let image = PhotoAndVideoMananger.mananger.getImageFromAssetID(id: model.ident)
self.backImageView.image = image
self.saveSizeLabel.text = String(format: "Save %.2f MB" ,Double(model.saveSize)/1024.0)
}
}
var choose : Bool = false {
didSet{
}
}
lazy var backImageView: UIImageView = {
let view = UIImageView()
view.isUserInteractionEnabled = true
view.contentMode = .scaleAspectFill
view.clipsToBounds = true
view.layer.masksToBounds = true
view.layer.cornerRadius = 12
return view
}()
lazy var saveSizeView: UIView = {
let view = UIView()
view.layer.masksToBounds = true
view.layer.cornerRadius = 4
view.backgroundColor = UIColor(red: 0, green: 0.51, blue: 1, alpha: 1)
return view
}()
lazy var saveSizeLabel: UILabel = {
let view = UILabel()
view.textAlignment = .left
view.textColor = UIColor(red: 1, green: 1, blue: 1, alpha: 1)
view.font = UIFont.systemFont(ofSize: 12, weight: .regular)
view.text = "Save 1.3MB"
return view
}()
lazy var moreImageView: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "icon_left_setting_grey")
view.backgroundColor = .clear
return view
}()
lazy var selectImageView: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "ic_sel_com")
view.backgroundColor = .clear
view.isUserInteractionEnabled = true
let tap = UITapGestureRecognizer()
tap.addTarget(self, action: #selector(selectClick))
view.addGestureRecognizer(tap)
return view
}()
@objc func selectClick(){
self.choose = !self.choose
if choose {
self.selectImageView.image = UIImage(named: "ic_unsel_com")
}else{
self.selectImageView.image = UIImage(named: "ic_sel_com")
}
callBack(self.model! ,self.choose)
}
override init(frame: CGRect) {
super.init(frame: frame)
self.addSubview(self.backImageView)
self.addSubview(self.saveSizeView)
self.saveSizeView.addSubview(self.saveSizeLabel)
self.saveSizeView.addSubview(self.moreImageView)
self.addSubview(self.selectImageView)
self.backImageView.snp.makeConstraints { make in
make.left.right.height.width.equalToSuperview()
}
self.saveSizeView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(12)
make.bottom.equalToSuperview().offset(-12)
make.height.equalTo(48)
make.width.equalTo(120)
}
self.saveSizeLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(8)
make.centerY.equalToSuperview()
make.height.equalTo(48)
make.width.equalTo(120)
}
self.moreImageView.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-4)
make.centerY.equalToSuperview()
make.height.width.equalTo(16)
}
self.selectImageView.snp.makeConstraints { make in
make.bottom.right.equalToSuperview().offset(-12)
make.height.width.equalTo(24)
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
//
// CompressCustomHeaderView.swift
// PhoneManager
//
// Created by edy on 2025/4/2.
//
import Foundation
class CompressCustomHeaderView: UICollectionReusableView{
var modeData = [ResourceModel]() {
didSet{
// 计算图片总大小
var sum = 0;
for model in self.modeData{
sum = sum + model.orgSize
}
self.siezLabel.text = String(format: "%.2f MB" ,(Double(sum)/1024.0))
self.saveSizeLabel.text = String(format: "%.2f MB" ,(Double(sum)/1024.0))
}
}
lazy var titlelabel :UILabel = {
let label = UILabel()
label.text = "Compress"
label.textAlignment = .left
label.textColor = UIColor(red: 0.2, green: 0.2, blue: 0.2, alpha: 1)
label.font = UIFont.systemFont(ofSize: 20, weight: .bold)
return label
}()
lazy var btnView :UIView = {
let view = UIView()
view.backgroundColor = UIColor(red: 0.95, green: 0.96, blue: 0.99, alpha: 1)
view.layer.cornerRadius = 16
view.clipsToBounds = true
return view
}()
lazy var selectImageView :UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "ic_newest_similar")
return view
}()
lazy var selectlabel :UILabel = {
let label = UILabel()
label.text = "Largest"
label.textAlignment = .center
label.textColor = UIColor(red: 0.2, green: 0.2, blue: 0.2, alpha: 1)
label.font = UIFont.systemFont(ofSize: 14, weight: .bold)
return label
}()
lazy var siezLabel :UILabel = {
let label = UILabel()
label.text = "1.02 GB"
label.textAlignment = .left
label.textColor = UIColor(red: 0, green: 0.51, blue: 1, alpha: 1)
label.font = UIFont.systemFont(ofSize: 14, weight: .regular)
return label
}()
lazy var changeView :UIView = {
let view = UIView()
view.backgroundColor = UIColor(red: 0.95, green: 0.96, blue: 0.99, alpha: 1)
view.layer.cornerRadius = 8
view.clipsToBounds = true
return view
}()
lazy var tipView :UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "ic_cmpress_home_nor")
return view
}()
lazy var tipLabel :UILabel = {
let label = UILabel()
label.text = "Compress your media filesand save up to"
label.textAlignment = .left
label.numberOfLines = 0
label.textColor = UIColor(red: 0.7, green: 0.7, blue: 0.7, alpha: 1)
label.font = UIFont.systemFont(ofSize: 12, weight: .regular)
return label
}()
lazy var saveSizeLabel :UILabel = {
let label = UILabel()
label.text = "511MB"
label.textAlignment = .right
label.textColor = UIColor(red: 0, green: 0.51, blue: 1, alpha: 1)
label.font = UIFont.systemFont(ofSize: 16, weight: .bold)
return label
}()
private func setUI(){
self.addSubview(self.titlelabel)
self.addSubview(self.btnView)
self.btnView.addSubview(self.selectImageView)
self.btnView.addSubview(self.selectlabel)
self.addSubview(self.siezLabel)
self.addSubview(self.changeView)
self.addSubview(self.tipView)
self.addSubview(self.tipLabel)
self.addSubview(self.saveSizeLabel)
self.titlelabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(0)
make.top.equalToSuperview().offset(14)
make.width.equalTo(96 * RScreenW())
make.height.equalTo(28)
}
self.btnView.snp.makeConstraints { make in
make.right.equalToSuperview().offset(0)
make.top.equalToSuperview().offset(12)
make.width.equalTo(103 * RScreenW())
make.height.equalTo(32)
}
self.selectImageView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(12)
make.centerY.equalToSuperview()
make.width.height.equalTo(20)
}
self.selectlabel.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-12)
make.top.equalToSuperview().offset(6)
make.width.equalTo(51 * RScreenW())
make.height.equalTo(20)
}
self.siezLabel.snp.makeConstraints { make in
make.left.equalTo(0)
make.right.equalTo(0)
make.top.equalTo(self.btnView.snp.bottom).offset(8)
make.height.equalTo(20)
}
self.changeView.snp.makeConstraints { make in
make.left.equalTo(0)
make.right.equalTo(0)
make.top.equalTo(self.siezLabel.snp.bottom).offset(12)
make.height.equalTo(46)
}
self.tipView.snp.makeConstraints { make in
make.left.equalTo(0)
make.top.equalTo(self.changeView.snp.bottom).offset(15)
make.width.height.equalTo(28)
}
self.tipLabel.snp.makeConstraints { make in
make.left.equalTo(self.tipView.snp.right).offset(4)
make.width.equalTo(206 * RScreenW())
make.height.equalTo(34)
make.centerY.equalTo(self.tipView.snp.centerY)
}
self.saveSizeLabel.snp.makeConstraints { make in
make.left.equalTo(self.tipLabel.snp.right).offset(4)
make.right.equalTo(0)
make.height.equalTo(22)
make.centerY.equalTo(self.tipView.snp.centerY)
}
}
override init(frame: CGRect) {
super.init(frame: frame)
setUI()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setUI()
}
}
//
// CompressNavView.swift
// PhoneManager
//
// Created by edy on 2025/4/2.
//
import Foundation
class CompressNavView : UIView {
private var backButton:UIButton!
private var proBtn:UIButton!
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setupUI() {
backgroundColor = .white
backButton = UIButton()
backButton.setImage(UIImage(named: "nav_back"), for: .normal)
backButton.addTarget(self, action: #selector(backBtnClick), for: .touchUpInside)
self.addSubview(backButton)
backButton.snp.makeConstraints { make in
make.centerY.equalTo(navCenterY)
make.left.equalToSuperview().offset(marginLR)
make.width.height.equalTo(iconWH)
}
proBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 70, height: iconWH))
proBtn.setBackgroundImage(UIImage(named: "home_pro_star_back"), for: .normal)
proBtn.addTarget(self, action: #selector(proBtnClick), for: .touchUpInside)
self.addSubview(proBtn)
proBtn.snp.makeConstraints { make in
make.centerY.equalTo(navCenterY)
make.right.equalToSuperview().offset(-15)
make.width.equalTo(70)
make.height.equalTo(iconWH)
}
}
@objc private func backBtnClick() {
self.responderViewController()?.navigationController?.popViewController(animated: true)
}
@objc private func proBtnClick() {
let homeNavViewModel = HomeNavViewModel()
let vc = HomePayViewController()
vc.modalPresentationStyle = .fullScreen
homeNavViewModel.presentToDetailController(currentView: self, destnationController: vc)
}
}
//
// CompressTipView.swift
// PhoneManager
//
// Created by edy on 2025/4/2.
//
import Foundation
class CompressTipView : UIView {
var callBack:callBack<Any> = {allow in}
override init(frame: CGRect) {
super.init(frame: frame)
self.addSubview(self.backView)
self.backView.addSubview(self.contentView)
self.contentView.addSubview(self.tipLabel)
self.contentView.addSubview(self.detailTiplabel)
self.contentView.addSubview(self.shotView)
self.contentView.addSubview(self.noAllowBtn)
self.contentView.addSubview(self.lineView)
self.contentView.addSubview(self.deleteBtn)
self.backView.snp.makeConstraints { make in
make.width.height.left.top.equalToSuperview()
}
self.contentView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(53)
make.right.equalToSuperview().offset(-53)
make.height.equalTo(310)
make.centerY.equalToSuperview()
}
self.tipLabel.snp.makeConstraints { make in
make.top.equalToSuperview().offset(16)
make.left.equalToSuperview().offset(16)
make.right.equalToSuperview().offset(-16)
make.height.equalTo(44)
}
self.detailTiplabel.snp.makeConstraints { make in
make.top.equalTo(self.tipLabel.snp.bottom).offset(2)
make.left.equalToSuperview().offset(16)
make.right.equalToSuperview().offset(-16)
make.height.equalTo(36)
}
self.shotView.snp.makeConstraints { make in
make.top.equalTo(self.detailTiplabel.snp.bottom).offset(16)
make.left.equalToSuperview().offset(16)
make.right.equalToSuperview().offset(-16)
make.height.equalTo(152)
}
self.noAllowBtn.snp.makeConstraints { make in
make.bottom.equalToSuperview()
make.left.equalToSuperview()
make.width.equalTo(134.25)
make.height.equalTo(44)
}
self.lineView.snp.makeConstraints { make in
make.bottom.equalToSuperview()
make.centerX.equalTo(self.shotView.snp.centerX)
make.width.equalTo(2)
make.height.equalTo(44)
}
self.deleteBtn.snp.makeConstraints { make in
make.bottom.equalToSuperview()
make.right.equalToSuperview()
make.width.equalTo(134.25)
make.height.equalTo(44)
}
}
lazy var backView: UIView = {
let view = UIView()
view.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5000)
return view
}()
lazy var contentView: UIView = {
let view = UIView()
view.backgroundColor = UIColor(red: 0.95, green: 0.96, blue: 0.99, alpha: 1)
view.clipsToBounds = true
view.layer.cornerRadius = 14
return view
}()
lazy var tipLabel: UILabel = {
let label = UILabel()
label.text = "Allow ”Al Cleaner“ to delete2 photos?"
label.textAlignment = .center
label.numberOfLines = 0
label.font = UIFont.systemFont(ofSize: 17, weight: .bold)
label.backgroundColor = .clear
return label
}()
lazy var detailTiplabel: UILabel = {
let label = UILabel()
label.text = "These photos will be deleted from iCloud Photos on all your devices."
label.textAlignment = .center
label.numberOfLines = 0
label.font = UIFont.systemFont(ofSize: 13, weight: .regular)
label.backgroundColor = .clear
return label
}()
lazy var shotView: UIView = {
let view = UIView()
view.backgroundColor = .gray
return view
}()
lazy var noAllowBtn: UIButton = {
let button = UIButton()
button.setTitle("Don't Allow", for: .normal)
button.setTitleColor(UIColor(red: 0, green: 0.48, blue: 1, alpha: 1), for: .normal)
button.addTarget(self, action: #selector(noAllowClick), for: .touchUpInside)
return button
}()
lazy var lineView: UIView = {
let view = UIView()
view.backgroundColor = UIColor(red: 0.24, green: 0.24, blue: 0.26, alpha: 0.3600)
return view
}()
lazy var deleteBtn: UIButton = {
let button = UIButton()
button.setTitle("Delete", for: .normal)
button.setTitleColor(UIColor(red: 0, green: 0.48, blue: 1, alpha: 1), for: .normal)
button.addTarget(self, action: #selector(deleteClick), for: .touchUpInside)
return button
}()
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc func noAllowClick(){
self.removeFromSuperview()
callBack(false)
}
@objc func deleteClick(){
self.removeFromSuperview()
callBack(true)
}
}
//
// CompressingViewController.swift
// PhoneManager
//
// Created by edy on 2025/4/2.
//
import Foundation
class CompressingView: UIView{
override init(frame: CGRect) {
super.init(frame: frame)
setUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
lazy var backView:UIView = {
let view = UIView()
view.backgroundColor = UIColor(red: 0, green: 0.51, blue: 1, alpha: 1)
return view
}()
lazy var animationView:UIView = {
let view = UIView()
view.backgroundColor = .gray
return view
}()
lazy var tipLabel:UILabel = {
let view = UILabel()
view.text = "We're freeing up space on your device."
view.textAlignment = .center
view.textColor = UIColor(red: 1, green: 1, blue: 1, alpha: 1)
return view
}()
func setUI(){
self.addSubview(self.backView)
self.addSubview(self.animationView)
self.addSubview(self.tipLabel)
self.backView.snp.makeConstraints { make in
make.top.bottom.left.right.equalToSuperview()
}
self.animationView.snp.makeConstraints { make in
make.width.height.equalTo(180)
make.centerX.equalToSuperview()
make.top.equalToSuperview().offset(156)
}
self.tipLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15)
make.centerX.equalToSuperview()
make.top.equalTo(self.animationView.snp.bottom).offset(95)
}
}
}
//
// QualityView.swift
// PhoneManager
//
// Created by edy on 2025/4/2.
//
import Foundation
class QualityView : UIView{
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = UIColor(red: 0.95, green: 0.96, blue: 0.99, alpha: 1)
self.layer.cornerRadius = 12
self.clipsToBounds = true
self.addSubview(self.tipLabel)
self.addSubview(self.detailTiplabel)
self.addSubview(self.selectedImageView)
self.tipLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(16)
make.top.equalToSuperview().offset(12)
make.width.equalTo(276)
make.height.equalTo(20)
}
self.detailTiplabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(16)
make.bottom.equalToSuperview().offset(-12)
make.width.equalTo(276)
make.height.equalTo(17)
}
self.selectedImageView.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-16)
make.centerY.equalToSuperview()
make.width.equalTo(24)
make.height.equalTo(24)
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
lazy var tipLabel: UILabel = {
let label = UILabel()
label.text = "Low quality"
label.textAlignment = .left
label.font = UIFont.systemFont(ofSize: 14, weight: .bold)
label.backgroundColor = .clear
return label
}()
lazy var detailTiplabel: UILabel = {
let label = UILabel()
label.text = "Compress up to 80% of the size"
label.textAlignment = .left
label.font = UIFont.systemFont(ofSize: 12, weight: .regular)
label.backgroundColor = .clear
return label
}()
lazy var selectedImageView: UIImageView = {
let imageView = UIImageView()
imageView.backgroundColor = .clear
imageView.image = UIImage(named: "ic_sel_com")
let tap = UITapGestureRecognizer()
tap.addTarget(self, action: #selector(selectClick))
imageView.addGestureRecognizer(tap)
return imageView
}()
@objc func selectClick(){
self.selectedImageView.image = UIImage(named: "ic_unsel_com")
}
}
......@@ -50,6 +50,16 @@ class HomeViewController:BaseViewController {
let vc:ChargeViewController = ChargeViewController()
self.navigationController?.pushViewController(vc, animated: true)
}
case 2 :
DispatchQueue.main.async {[weak self] in
guard let self else {return}
let vc:CompressController = CompressController()
self.navigationController?.pushViewController(vc, animated: true)
}
......
......@@ -9,16 +9,6 @@
"heightImage": "tabbar_secret_hight",
"text":"Secret Space",
},
{
"normalImage": "ic_contacts_home_pre",
"heightImage": "tabbar_contacts_high",
"text":"Contacts",
},
{
"normalImage": "ic_email_home_pre",
"heightImage": "tabbar_email_high",
"text":"Email Cleaner",
},
{
"normalImage": "ic_cmpress_home_pre",
"heightImage": "tabbar_cmpress_high",
......
......@@ -57,7 +57,7 @@ class HomeNavView:UIView {
proBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 70, height: iconWH))
proBtn.setBackgroundImage(UIImage(named: "home_pro_star_back"), for: .normal)
proBtn.addTarget(self, action: #selector(settingBtnClick), for: .touchUpInside)
proBtn.addTarget(self, action: #selector(proBtnClick), for: .touchUpInside)
self.addSubview(proBtn)
proBtn.snp.makeConstraints { make in
......@@ -84,6 +84,13 @@ class HomeNavView:UIView {
homeNavViewModel.pushToDetailController(currentView: self, destnationController: settingViewController)
}
@objc private func proBtnClick() {
let homeNavViewModel = HomeNavViewModel()
let vc = HomePayViewController()
vc.modalPresentationStyle = .fullScreen
homeNavViewModel.presentToDetailController(currentView: self, destnationController: vc)
}
func setFileAndCount(count:Int,fileSize:Double) {
......
......@@ -53,6 +53,8 @@ class PhotoDataManager {
private func loadDataFromPhotos(resultModel:@escaping (_ model:PhotosManagerModel) -> () = {mdoel in}) {
PhotoAndVideoMananger.mananger.setAssets()
let model1:HomePhotosModel = HomePhotosModel(folderName: PhotsFileType.duplicates.rawValue, allFileSize: 0, assets: [])
let model2:HomePhotosModel = HomePhotosModel(folderName: PhotsFileType.similar.rawValue, allFileSize: 0, assets: [])
......@@ -71,6 +73,7 @@ class PhotoDataManager {
resultModel(allModel)
PhotoAndVideoMananger.mananger.fetXSOther { array in
let dispatchGroup = DispatchGroup()
......@@ -96,13 +99,16 @@ class PhotoDataManager {
dispatchGroup.leave()
}
dispatchGroup.enter()
model2.assets = [ResourceManager.manager.getAllVideo()]
dispatchGroup.leave()
dispatchGroup.enter()
PhotoAndVideoMananger.mananger.fetXSVideo { array in
PhotoSimilarityFinder.processSimilarVideoGroups(videoGroups: array) {ids in
model3.assets = ids
model4.assets = ids
resultModel(allModel)
......@@ -110,6 +116,10 @@ class PhotoDataManager {
}
}
dispatchGroup.notify(queue: .main) {
print("所有异步操作都已完成")
......
......@@ -2,6 +2,9 @@ import UIKit
class HomeOtherCollectionCell: UICollectionViewCell {
var similarFlag : Bool = false
// MARK: - Properties
static let identifier = "HomeOtherCollectionCellID"
......@@ -14,22 +17,39 @@ class HomeOtherCollectionCell: UICollectionViewCell {
return iv
}()
private let countLabel: UILabel = {
private let infoBackView: UIView = {
let iv = UIView()
iv.clipsToBounds = true
iv.layer.cornerRadius = 8
iv.backgroundColor = UIColor(red: 0, green: 0.51, blue: 1, alpha: 1)
return iv
}()
let countLabel: UILabel = {
let label = UILabel()
label.textColor = .white
label.font = .systemFont(ofSize: 16, weight: .medium)
label.textAlignment = .center
label.font = .systemFont(ofSize: 10, weight: .medium)
label.textAlignment = .left
return label
}()
private let sizeLabel: UILabel = {
let sizeLabel: UILabel = {
let label = UILabel()
label.textColor = .systemGray
label.font = .systemFont(ofSize: 12)
label.textColor = UIColor(red: 0.6, green: 0.8, blue: 1, alpha: 1)
label.font = .systemFont(ofSize: 8, weight: .regular)
label.textAlignment = .left
return label
}()
private let moreImageView: UIImageView = {
let iv = UIImageView()
iv.contentMode = .scaleAspectFill
iv.image = UIImage(named: "icon_left_setting_grey")
iv.backgroundColor = .clear
return iv
}()
private let titleLabel: UILabel = {
let label = UILabel()
label.font = .systemFont(ofSize: 16, weight: .bold)
......@@ -52,11 +72,14 @@ class HomeOtherCollectionCell: UICollectionViewCell {
// MARK: - Setup
private func setupUI() {
backgroundColor = UIColor.colorWithHex(hexStr: "#F2F6FC")
self.contentView.addSubview(self.titleLabel)
self.contentView.addSubview(self.imageView)
self.imageView.addSubview(self.infoBackView)
self.infoBackView.addSubview(self.countLabel)
self.infoBackView.addSubview(self.sizeLabel)
self.infoBackView.addSubview(self.moreImageView)
contentView.addSubview(imageView)
contentView.addSubview(countLabel)
contentView.addSubview(sizeLabel)
contentView.addSubview(titleLabel)
}
......@@ -87,14 +110,14 @@ class HomeOtherCollectionCell: UICollectionViewCell {
func configure(with image: UIImage?, count: Int, size: String) {
imageView.image = image
countLabel.text = "\(count) Photos"
sizeLabel.text = size
sizeLabel.text = "(\(size)) MB"
}
override func prepareForReuse() {
super.prepareForReuse()
imageView.image = nil
countLabel.text = nil
sizeLabel.text = nil
countLabel.text = "0 Photos"
sizeLabel.text = "(0.0) MB"
}
override func layoutSubviews() {
......@@ -103,12 +126,17 @@ class HomeOtherCollectionCell: UICollectionViewCell {
self.layer.masksToBounds = true
imageView.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.bottom.equalToSuperview().offset(-16)
make.width.equalToSuperview().offset(-32)
make.height.equalTo(self.width - 32)
}
self.infoBackView.snp.makeConstraints { make in
make.right.bottom.equalToSuperview()
make.height.equalTo(40)
make.width.equalTo(114)
}
......@@ -118,6 +146,24 @@ class HomeOtherCollectionCell: UICollectionViewCell {
make.width.equalToSuperview().offset(-32)
}
self.countLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(12)
make.top.equalToSuperview().offset(4)
make.width.equalTo(68)
make.height.equalTo(20)
}
self.sizeLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(12)
make.top.equalTo(countLabel.snp.bottom).offset(0)
make.width.equalTo(68)
make.height.equalTo(14)
}
self.moreImageView.snp.makeConstraints { make in
make.width.height.equalTo(20)
make.right.equalToSuperview().offset(-12)
make.centerY.equalToSuperview()
}
titleLabel.sizeToFit()
}
}
......@@ -16,4 +16,10 @@ class HomeNavViewModel{
}
func presentToDetailController(currentView : UIView, destnationController: UIViewController) {
let vc = currentView.responderViewController()?.navigationController
vc?.present(destnationController, animated: true)
}
}
......@@ -41,7 +41,7 @@ class HomePayViewController:UIViewController {
switch operstatus {
case .close:
self.navigationController?.dismiss(animated: true)
self.dismiss(animated: true)
default:
break
}
......
......@@ -29,28 +29,41 @@ struct RowInfoModel{
func getSettingViewInfo() -> [SettingModel] {
return [
SettingModel(sectionTitle: "",rowInfo: [RowInfoModel(imageName: "",title: "")]),
SettingModel(sectionTitle: "FROM DEVELOPER",rowInfo:
[RowInfoModel(imageName: "ic_more_setting",title: "More Apps From Us")]),
SettingModel(sectionTitle: "EMAIL",rowInfo:
[RowInfoModel(imageName: "ic_out_setting",title: "Sign Out")]),
SettingModel(sectionTitle: "UTILITIES",rowInfo:
[RowInfoModel(imageName: "ic_widgets_setting",title: "Widgets")]),
SettingModel(sectionTitle: "SECRET SPACE",rowInfo: [
RowInfoModel(imageName: "ic_pin_setting",title: "Use PIN"),
RowInfoModel(imageName: "ic_delete_setting",title: "Remove After lmport")]),
SettingModel(sectionTitle: "OTHERS",rowInfo:
[RowInfoModel(imageName: "ic_vibration_setting",title: "Vibration"),
RowInfoModel(imageName: "ic_list_setting",title: "Keep List"),
RowInfoModel(imageName: "ic_hints_setting",title: "Hints")]),
SettingModel(sectionTitle: "SUPPORT",rowInfo:
[RowInfoModel(imageName: "ic_faq_setting",title: "FAQ"),
RowInfoModel(imageName: "ic_email_setting",title: "Email Support"),
RowInfoModel(imageName: "ic_restore_setting",title: "Restore Purchase"),
RowInfoModel(imageName: "ic_about_setting",title: "About Us"),
RowInfoModel(imageName: "ic_privacy_setting",title: "Privacy Policy")]),
SettingModel(sectionTitle: "STAY IN TOUCH",rowInfo:
[RowInfoModel(imageName: "ic_rate_setting",title: "Rate App"),
RowInfoModel(imageName: "ic_share_setting",title: "Share App"),
RowInfoModel(imageName: "ic_ins_setting",title: "Follow on Instagram")])]
// SettingModel(sectionTitle: "",rowInfo: [RowInfoModel(imageName: "",title: "")]),
// SettingModel(sectionTitle: "FROM DEVELOPER",rowInfo:
// [RowInfoModel(imageName: "ic_more_setting",title: "More Apps From Us")]),
// SettingModel(sectionTitle: "EMAIL",rowInfo:
// [RowInfoModel(imageName: "ic_out_setting",title: "Sign Out")]),
// SettingModel(sectionTitle: "UTILITIES",rowInfo:
// [RowInfoModel(imageName: "ic_widgets_setting",title: "Widgets")]),
// SettingModel(sectionTitle: "SECRET SPACE",rowInfo: [
// RowInfoModel(imageName: "ic_pin_setting",title: "Use PIN"),
// RowInfoModel(imageName: "ic_delete_setting",title: "Remove After lmport")]),
// SettingModel(sectionTitle: "OTHERS",rowInfo:
// [RowInfoModel(imageName: "ic_vibration_setting",title: "Vibration"),
// RowInfoModel(imageName: "ic_list_setting",title: "Keep List"),
// RowInfoModel(imageName: "ic_hints_setting",title: "Hints")]),
// SettingModel(sectionTitle: "SUPPORT",rowInfo:
// [RowInfoModel(imageName: "ic_faq_setting",title: "FAQ"),
// RowInfoModel(imageName: "ic_email_setting",title: "Email Support"),
// RowInfoModel(imageName: "ic_restore_setting",title: "Restore Purchase"),
// RowInfoModel(imageName: "ic_about_setting",title: "About Us"),
// RowInfoModel(imageName: "ic_privacy_setting",title: "Privacy Policy")]),
// SettingModel(sectionTitle: "STAY IN TOUCH",rowInfo:
// [RowInfoModel(imageName: "ic_rate_setting",title: "Rate App"),
// RowInfoModel(imageName: "ic_share_setting",title: "Share App"),
// RowInfoModel(imageName: "ic_ins_setting",title: "Follow on Instagram")])]
SettingModel(sectionTitle: "",rowInfo: [RowInfoModel(imageName: "",title: "")]),
SettingModel(sectionTitle: "FROM DEVELOPER",rowInfo:
[RowInfoModel(imageName: "ic_more_setting",title: "More Apps From Us")]),
SettingModel(sectionTitle: "UTILITIES",rowInfo:
[RowInfoModel(imageName: "ic_widgets_setting",title: "Widgets")]),
SettingModel(sectionTitle: "SECRET SPACE",rowInfo: [
RowInfoModel(imageName: "ic_pin_setting",title: "Use PIN")]),
SettingModel(sectionTitle: "STAY IN TOUCH",rowInfo:
[RowInfoModel(imageName: "ic_rate_setting",title: "Rate App"),
RowInfoModel(imageName: "ic_share_setting",title: "Share App"),
RowInfoModel(imageName: "ic_ins_setting",title: "Follow on Instagram")])]
}
......@@ -41,9 +41,9 @@ class SettingViewHeaderCell : UITableViewCell {
let preButtonImageView = UIImageView()
preButtonImageView.image = UIImage(named: "img_light_setting")
preButtonImageView.backgroundColor = .clear
let tap = UITapGestureRecognizer()
tap.addTarget(SettingNormalCell.self, action: #selector(leanMoreBtnClick))
preButtonImageView.isUserInteractionEnabled = true
let tap = UITapGestureRecognizer()
tap.addTarget(self, action: #selector(leanMoreBtnClick))
preButtonImageView.addGestureRecognizer(tap)
return preButtonImageView
......@@ -59,7 +59,7 @@ class SettingViewHeaderCell : UITableViewCell {
sview.layer.cornerRadius = 23
sview.layer.masksToBounds = true
sview.addTarget(SettingViewHeaderCell.self, action: #selector(leanMoreBtnClick), for: .touchUpInside)
sview.addTarget(self, action: #selector(leanMoreBtnClick), for: .touchUpInside)
return sview
}()
......@@ -112,8 +112,10 @@ class SettingViewHeaderCell : UITableViewCell {
}
@objc func leanMoreBtnClick() {
Print("点击了---Learn More")
let homeNavViewModel = HomeNavViewModel()
let vc = HomePayViewController()
vc.modalPresentationStyle = .fullScreen
homeNavViewModel.presentToDetailController(currentView: self, destnationController: vc)
}
}
......@@ -63,7 +63,7 @@ class SettingViewController : BaseViewController , UITableViewDelegate, UITableV
let model : SettingModel = modelData![indexPath.section]
let detailModel : RowInfoModel = model.rowInfo[indexPath.row]
if indexPath.section == 4 || (indexPath.section == 5 && indexPath.row == 0){
if indexPath.section == 3 {
let cell : SettingSwitchCell = tableView.dequeueReusableCell(withIdentifier: "SettingSwitchCell",for: indexPath) as! SettingSwitchCell
cell.fLabel.text = detailModel.title
cell.logoView.image = UIImage(named: detailModel.imageName)
......@@ -145,7 +145,6 @@ class SettingViewController : BaseViewController , UITableViewDelegate, UITableV
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
Print("点了")
let signOutTipView = SignOutTipView(frame: self.view.frame)
self.view.addSubview(signOutTipView)
}
......
......@@ -42,6 +42,8 @@ class PhotoAndVideoMananger {
var allAssets:[PHAsset] = []
var screenShotAssets:[PHAsset] = []
var imageAssets:[PHAsset] = []
var videoAssets:[PHAsset] = []
......@@ -56,16 +58,24 @@ class PhotoAndVideoMananger {
let videoAllAssets = PHAsset.fetchAssets(with: .video, options: fetchOptions)
let fetchOptionsS = PHFetchOptions()
fetchOptionsS.predicate = NSPredicate(format: "mediaSubtypes & %d != 0", PHAssetMediaSubtype.photoScreenshot.rawValue)
let screenShotAllAssets = PHAsset.fetchAssets(with: .image, options: fetchOptions)
let photoAssetsArray = photoAllAssets.objects(at: IndexSet(0..<photoAllAssets.count))
let videoAssetsArray = videoAllAssets.objects(at: IndexSet(0..<videoAllAssets.count))
let screenShotArray = screenShotAllAssets.objects(at: IndexSet(0..<screenShotAllAssets.count))
let combinedArray = photoAssetsArray + videoAssetsArray
imageAssets = photoAssetsArray
videoAssets = videoAssetsArray
screenShotAssets = screenShotArray
allAssets = combinedArray
}
......@@ -187,6 +197,24 @@ class PhotoAndVideoMananger {
}
}
func fetXSScreenShot( resulte:@escaping ([[PHAsset]]) -> Void) {
let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "mediaSubtypes & %d != 0", PHAssetMediaSubtype.photoScreenshot.rawValue)
let screenshotAssets = PHAsset.fetchAssets(with: .image, options: fetchOptions)
let assetsArray = screenshotAssets.objects(at: IndexSet(0..<allAssets.count))
DispatchQueue.global().async {[weak self] in
guard let self = self else { return }
let newArray = self.groupSimilarAssets(from: assetsArray)
resulte(newArray)
}
}
func fetXSVideo( resulte:@escaping ([[PHAsset]]) -> Void) {
let fetchOptions = PHFetchOptions()
......
//
// ResourceManager.swift
// PhoneManager
//
// Created by edy on 2025/4/1.
//
import Foundation
import Photos
class ResourceManager {
static let manager : ResourceManager = ResourceManager()
func getAllPhotos()-> [String]{
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
let videoAssets = PHAsset.fetchAssets(with: .image, options: fetchOptions)
let assetsArray = videoAssets.objects(at: IndexSet(0..<videoAssets.count))
var array : [String] = []
for ass in assetsArray{
array.append(ass.localIdentifier)
}
return array
}
func getAllPhotosByPHAsset()-> [PHAsset]{
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
let videoAssets = PHAsset.fetchAssets(with: .image, options: fetchOptions)
let assetsArray = videoAssets.objects(at: IndexSet(0..<videoAssets.count))
return assetsArray
}
/// 获取所有视频
/// - Returns: 视频集合
func getAllVideo() -> [String]{
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
let videoAssets = PHAsset.fetchAssets(with: .video, options: fetchOptions)
let assetsArray = videoAssets.objects(at: IndexSet(0..<videoAssets.count))
var array : [String] = []
for ass in assetsArray{
array.append(ass.localIdentifier)
}
return array
}
}
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