Commit fe59c4f0 authored by CZ1004's avatar CZ1004

项目位置

parent 1cc0c07d
//
// 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)
}
}
}
}
...@@ -9,6 +9,8 @@ import Foundation ...@@ -9,6 +9,8 @@ import Foundation
class CompressCompletedViewController : BaseViewController{ class CompressCompletedViewController : BaseViewController{
var model : [ResourceModel]?
lazy var imageView: UIImageView = { lazy var imageView: UIImageView = {
let imageView = UIImageView() let imageView = UIImageView()
imageView.clipsToBounds = true imageView.clipsToBounds = true
......
//
// CompressController.swift
// PhoneManager
//
// Created by edy on 2025/4/2.
//
import Foundation
import SnapKit
import Photos
class CompressController : BaseViewController {
private var compressNav:CompressNavView?
// 排序
var currentSort : Int = 0 {
didSet{
clearSelected()
}
}
// 资源类型 - 相册或者视频
var currentResourceType : Int = 0
// 所有的数据
var resourceData = [ResourceModel](){
didSet{
DispatchQueue.main.async {
self.collectionView.reloadData()
}
}
}
// 当前页面选中的
var selectedModel : [ResourceModel] = []
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)
view.addTarget(self, action: #selector(startCompress), 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.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()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// 这里默认去请求下当前的数据资源
let viewModel = CompressViewModel()
viewModel.getAllPhotos {[weak self] models in
guard let self else {return}
self.resourceData = models
}
}
}
extension CompressController:WaterfallMutiSectionDelegate,UICollectionViewDataSource,UICollectionViewDelegate {
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.resourceData.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CompressSelectCell", for: indexPath) as! CompressSelectCell
cell.model = self.resourceData[indexPath.row]
if self.selectedModel.count == 0 {
cell.choose = false
}
cell.callBack = {[weak self] (model:ResourceModel,choose:Bool) ->() in
guard let self else{ return}
// 这里临时管理一个当前选择的资源
if choose == true && !self.selectedModel.contains(model) {
self.selectedModel.append(model)
}
if choose == false && self.selectedModel.contains(model){
if let index = selectedModel.firstIndex(of: model) {
selectedModel.remove(at: index)
}
}
DispatchQueue.main.async {
// 选择完成后检查选择的是否有值,有值则变换底部的按钮
self.updateSubmitButton()
}
}
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.callBack = {[weak self] text in
guard let self else {return}
let sortView = CompressSortView(frame: self.view.bounds)
// 这两行是为了进入页面的时候选中
sortView.currentIndex = self.currentSort
sortView.tableView.reloadData()
self.view.addSubview(sortView)
sortView.callBack = {[weak self] sortType in
guard let self else {return}
self.currentSort = sortType as! Int
self.sortByType(sortType: self.currentSort, header: header)
}
}
header.modeData = self.resourceData
return header
}else{
let footer = collectionView.dequeueReusableSupplementaryView(
ofKind: kind,
withReuseIdentifier: "footerID",
for: indexPath
)
return footer
}
}
func sortByType(sortType:Int,header:CompressCustomHeaderView){
let viewModel = CompressViewModel()
switch sortType {
case 0:
header.selectlabel.text = "Largest"
// 按照文件大小降序
self.resourceData = viewModel.sortRsource(resource: self.resourceData, sortType: 1, sortKind: 0)
break
case 1:
header.selectlabel.text = "Smallest"
// 按照文件大小升序
self.resourceData = viewModel.sortRsource(resource: self.resourceData, sortType: 0, sortKind: 0)
break
case 2:
header.selectlabel.text = "Newest"
// 按照时间降序
self.resourceData = viewModel.sortRsource(resource: self.resourceData, sortType: 1, sortKind: 1)
break
case 3:
header.selectlabel.text = "Oldest"
// 按照时间升序
self.resourceData = viewModel.sortRsource(resource: self.resourceData, sortType: 0, sortKind: 1)
break
default:
break
}
}
func updateSubmitButton(){
if self.selectedModel.count > 0 {
self.submitButton.backgroundColor = UIColor(red: 0, green: 0.51, blue: 1, alpha: 1)
if self.currentResourceType == 0 {
self.submitButton.setTitle("Compress \(self.selectedModel.count) photos", for: UIControl.State.normal)
}else{
self.submitButton.setTitle("Compress \(self.selectedModel.count) videos", for: UIControl.State.normal)
}
self.submitButton.setTitleColor(.white, for: .normal)
}else{
self.submitButton.backgroundColor = UIColor(red: 0.7, green: 0.7, blue: 0.7, alpha: 1)
self.submitButton.setTitle("Compress", for: UIControl.State.normal)
self.submitButton.setTitleColor(UIColor(red: 1, green: 1, blue: 1, alpha: 1), for: .normal)
}
}
@objc func startCompress(){
// 如果没有不进行下一步操作
if self.selectedModel.count == 0 {
return
}
// 先将值传到下一个页面
let vc : CompressQualityController = CompressQualityController()
vc.model = self.selectedModel
vc.detailTiplabel.text = "You've selected \(self.selectedModel.count) out of \(self.resourceData.count) photos to compress."
self.navigationController?.pushViewController(vc, animated: true)
// 然后清理下当前页面的值
clearSelected()
}
func clearSelected() {
self.selectedModel.removeAll()
self.updateSubmitButton()
}
}
//
// 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")
}
}
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