Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
P
PhoneManager
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Yang
PhoneManager
Commits
4a1b6582
Commit
4a1b6582
authored
Apr 30, 2025
by
CZ1004
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
【新增】视频压缩基础代码
parent
210ea389
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
188 additions
and
108 deletions
+188
-108
CompressSelectCell.swift
...ager/Class/Session/Compress/Cell/CompressSelectCell.swift
+119
-18
CompressCompletedViewController.swift
...Compress/Controller/CompressCompletedViewController.swift
+8
-8
CompressController.swift
...lass/Session/Compress/Controller/CompressController.swift
+18
-13
CompressQualityController.swift
...ssion/Compress/Controller/CompressQualityController.swift
+5
-5
ResourceModel.swift
...eManager/Class/Session/Compress/Model/ResourceModel.swift
+0
-21
CompressCustomHeaderView.swift
...lass/Session/Compress/View/CompressCustomHeaderView.swift
+3
-3
CompressSwitchView.swift
...ager/Class/Session/Compress/View/CompressSwitchView.swift
+15
-20
CompressingView.swift
...Manager/Class/Session/Compress/View/CompressingView.swift
+1
-1
CompressViewModel.swift
.../Class/Session/Compress/ViewModel/CompressViewModel.swift
+15
-15
HomePhotosDetailViewController.swift
...sion/Home/Controller/HomePhotosDetailViewController.swift
+1
-1
HomePhotosModel .swift
...ager/Class/Session/Home/View/Model/HomePhotosModel .swift
+1
-1
PhotoAndVideoMananger.swift
...l/Class/PhotoAndVideoMananger/PhotoAndVideoMananger.swift
+1
-1
Singleton.swift
PhoneManager/Class/Tool/Singleton/Singleton.swift
+1
-1
No files found.
PhoneManager/Class/Session/Compress/Cell/CompressSelectCell.swift
View file @
4a1b6582
...
@@ -8,28 +8,52 @@
...
@@ -8,28 +8,52 @@
import
Foundation
import
Foundation
import
Photos
import
Photos
typealias
CompressSelectCellCallback
=
(
ResourceModel
,
Bool
)
->
Void
typealias
CompressSelectCellCallback
=
(
AssetModel
,
Bool
)
->
Void
class
CompressSelectCell
:
UICollectionViewCell
{
class
CompressSelectCell
:
UICollectionViewCell
{
var
callBack
:
CompressSelectCellCallback
=
{
model
,
choose
in
}
var
callBack
:
CompressSelectCellCallback
=
{
model
,
choose
in
}
var
currentMediaType
:
Int
=
0
var
currentMediaType
:
CompressType
=
.
compressPhoto
{
didSet
{
DispatchQueue
.
main
.
async
{
if
self
.
currentMediaType
==
.
compressPhoto
{
self
.
playImageView
.
isHidden
=
true
}
else
{
self
.
playImageView
.
isHidden
=
false
}
}
}
}
var
model
:
Resource
Model
?
{
var
model
:
Asset
Model
?
{
didSet
{
didSet
{
guard
let
model
=
self
.
model
else
{
return
}
guard
let
model
=
self
.
model
else
{
return
}
self
.
backImageView
.
image
=
UIImage
()
self
.
backImageView
.
image
=
UIImage
()
if
self
.
currentMediaType
==
.
compressPhoto
{
let
viewModel
=
CompressViewModel
()
let
viewModel
=
CompressViewModel
()
viewModel
.
getImageFromAssetIdentifier
(
identifier
:
model
.
ident
)
{[
weak
self
]
image
in
viewModel
.
getImageFromAssetIdentifier
(
identifier
:
model
.
localIdentifier
)
{[
weak
self
]
image
in
guard
let
self
else
{
return
}
guard
let
self
else
{
return
}
DispatchQueue
.
main
.
async
{
DispatchQueue
.
main
.
async
{
self
.
backImageView
.
image
=
image
self
.
backImageView
.
image
=
image
}
}
}
else
{
PhotoAndVideoMananger
.
mananger
.
getVideoImageByIdent
(
ident
:
model
)
{
image
in
DispatchQueue
.
main
.
async
{
self
.
backImageView
.
image
=
image
}
}
errorHandler
:
{
print
(
"获取视频图片资源失败"
)
}
}
}
}
// 这里不再进行计算了 直接按照50%的去计算
// 这里不再进行计算了 直接按照50%的去计算
let
saveSize
=
model
.
org
Size
/
2
let
saveSize
=
model
.
asset
Size
/
2
let
sizeKB
:
Double
=
saveSize
/
1000
let
sizeKB
:
Double
=
saveSize
/
1000
DispatchQueue
.
main
.
async
{
DispatchQueue
.
main
.
async
{
if
sizeKB
<
1000
{
if
sizeKB
<
1000
{
...
@@ -65,6 +89,15 @@ class CompressSelectCell : UICollectionViewCell {
...
@@ -65,6 +89,15 @@ class CompressSelectCell : UICollectionViewCell {
return
view
return
view
}()
}()
lazy
var
playImageView
:
UIImageView
=
{
let
view
=
UIImageView
()
view
.
backgroundColor
=
.
clear
view
.
image
=
UIImage
(
named
:
"btn_play_home"
)
view
.
isUserInteractionEnabled
=
true
view
.
isHidden
=
true
return
view
}()
lazy
var
saveSizeView
:
UIView
=
{
lazy
var
saveSizeView
:
UIView
=
{
let
view
=
UIView
()
let
view
=
UIView
()
...
@@ -127,6 +160,7 @@ class CompressSelectCell : UICollectionViewCell {
...
@@ -127,6 +160,7 @@ class CompressSelectCell : UICollectionViewCell {
self
.
addGestureRecognizer
(
tap
)
self
.
addGestureRecognizer
(
tap
)
self
.
addSubview
(
self
.
backImageView
)
self
.
addSubview
(
self
.
backImageView
)
self
.
backImageView
.
addSubview
(
self
.
playImageView
)
self
.
addSubview
(
self
.
saveSizeView
)
self
.
addSubview
(
self
.
saveSizeView
)
self
.
saveSizeView
.
addSubview
(
self
.
saveSizeLabel
)
self
.
saveSizeView
.
addSubview
(
self
.
saveSizeLabel
)
self
.
saveSizeView
.
addSubview
(
self
.
moreImageView
)
self
.
saveSizeView
.
addSubview
(
self
.
moreImageView
)
...
@@ -137,6 +171,10 @@ class CompressSelectCell : UICollectionViewCell {
...
@@ -137,6 +171,10 @@ class CompressSelectCell : UICollectionViewCell {
self
.
backImageView
.
snp
.
makeConstraints
{
make
in
self
.
backImageView
.
snp
.
makeConstraints
{
make
in
make
.
left
.
right
.
height
.
width
.
equalToSuperview
()
make
.
left
.
right
.
height
.
width
.
equalToSuperview
()
}
}
self
.
playImageView
.
snp
.
makeConstraints
{
make
in
make
.
center
.
equalToSuperview
()
make
.
width
.
height
.
equalTo
(
43
)
}
self
.
saveSizeView
.
snp
.
makeConstraints
{
make
in
self
.
saveSizeView
.
snp
.
makeConstraints
{
make
in
make
.
left
.
equalToSuperview
()
.
offset
(
12
)
make
.
left
.
equalToSuperview
()
.
offset
(
12
)
make
.
bottom
.
equalToSuperview
()
.
offset
(
-
12
)
make
.
bottom
.
equalToSuperview
()
.
offset
(
-
12
)
...
@@ -176,16 +214,79 @@ class CompressSelectCell : UICollectionViewCell {
...
@@ -176,16 +214,79 @@ class CompressSelectCell : UICollectionViewCell {
@objc
func
imageClick
(){
@objc
func
imageClick
(){
if
self
.
currentMediaType
==
0
{
// 如果是图片
let
vc
:
PreViewController
=
PreViewController
()
vc
.
imageIdent
=
self
.
model
!.
ident
self
.
responderViewController
()?
.
navigationController
?
.
pushViewController
(
vc
,
animated
:
true
)
if
self
.
currentMediaType
==
.
compressPhoto
{
// // 如果是图片
// let vc : PreViewController = PreViewController()
// vc.imageIdent = self.model!.localIdentifier
// self.responderViewController()?.navigationController?.pushViewController(vc, animated: true)
// 点击之后跳转详情页面
if
let
tempModel
=
self
.
model
{
let
vc
=
PMShowImgVideoController
()
vc
.
state
=
.
similarPhotos
vc
.
currentIdx
=
0
let
dataSource
=
ImageSeletedCollectionItem
()
dataSource
.
isSeleted
=
true
dataSource
.
id
=
tempModel
// 获取image
dataSource
.
image
=
PhotoAndVideoMananger
.
mananger
.
getImageFromAssetID
(
id
:
tempModel
.
localIdentifier
)
vc
.
homeDataSource
=
[
dataSource
]
self
.
responderViewController
()?
.
navigationController
?
.
pushViewController
(
vc
,
animated
:
true
)
}
}
else
{
}
else
{
// 如果是视频
// 如果是视频
let
vc
:
PreVideoController
=
PreVideoController
(
localIdentifier
:
self
.
model
!.
ident
)
// let vc : PreVideoController = PreVideoController(localIdentifier: self.model!.localIdentifier)
self
.
responderViewController
()?
.
navigationController
?
.
pushViewController
(
vc
,
animated
:
true
)
// self.responderViewController()?.navigationController?.pushViewController(vc, animated: true)
}
if
let
tempModel
=
self
.
model
{
// 获取视频的图片
PhotoAndVideoMananger
.
mananger
.
getVideoImageByIdent
(
ident
:
tempModel
)
{
image
in
// 点击之后跳转详情页面
let
vc
=
PMShowImgVideoController
()
vc
.
state
=
.
similarVideos
vc
.
currentIdx
=
0
let
dataSource
=
ImageSeletedCollectionItem
()
dataSource
.
isSeleted
=
true
dataSource
.
id
=
tempModel
dataSource
.
image
=
image
// 表示这个是视频
vc
.
homeDataSource
=
[
dataSource
]
vc
.
getVideoURLFromLocalIdentifier
(
localIdentifier
:
tempModel
.
localIdentifier
)
{
url
,
error
in
if
url
!=
nil
{
DispatchQueue
.
main
.
async
{
vc
.
url
=
url
self
.
responderViewController
()?
.
navigationController
?
.
pushViewController
(
vc
,
animated
:
true
)
}
}
else
{
let
alert
=
UIAlertController
(
title
:
nil
,
message
:
"ICloud video cannot be viewed"
,
preferredStyle
:
.
alert
)
self
.
responderViewController
()?
.
present
(
alert
,
animated
:
true
,
completion
:
nil
)
// 2 秒后关闭弹窗
DispatchQueue
.
main
.
asyncAfter
(
deadline
:
.
now
()
+
1
)
{
alert
.
dismiss
(
animated
:
true
,
completion
:
nil
)
}
}
}
}
errorHandler
:
{
DispatchQueue
.
main
.
async
{
let
alert
=
UIAlertController
(
title
:
nil
,
message
:
"Get Video image failure"
,
preferredStyle
:
.
alert
)
self
.
responderViewController
()?
.
navigationController
?
.
present
(
alert
,
animated
:
true
)
// 1秒之后消失
DispatchQueue
.
main
.
asyncAfter
(
deadline
:
.
now
()
+
1
)
{
alert
.
dismiss
(
animated
:
true
,
completion
:
nil
)
self
.
responderViewController
()?
.
navigationController
?
.
popViewController
(
animated
:
true
)
}
}
}
}
}
}
}
}
}
PhoneManager/Class/Session/Compress/Controller/CompressCompletedViewController.swift
View file @
4a1b6582
...
@@ -11,13 +11,13 @@ import Lottie
...
@@ -11,13 +11,13 @@ import Lottie
class
CompressCompletedViewController
:
BaseViewController
{
class
CompressCompletedViewController
:
BaseViewController
{
var
model
:
[
Resource
Model
]?
var
model
:
[
Asset
Model
]?
var
comDataSource
:
[
Data
]
=
[]
var
comDataSource
:
[
Data
]
=
[]
var
comVideoDataSource
:
[
URL
?]
=
[]
var
comVideoDataSource
:
[
URL
?]
=
[]
var
currentMediaType
:
Int
=
0
var
currentMediaType
:
CompressType
=
.
compressPhoto
lazy
var
animationView
:
LottieAnimationView
=
{
lazy
var
animationView
:
LottieAnimationView
=
{
let
animationView
=
LottieAnimationView
(
name
:
"CompressCompletedLight"
)
let
animationView
=
LottieAnimationView
(
name
:
"CompressCompletedLight"
)
...
@@ -256,7 +256,7 @@ class CompressCompletedViewController : BaseViewController{
...
@@ -256,7 +256,7 @@ class CompressCompletedViewController : BaseViewController{
}
}
@objc
func
completedAction
(){
@objc
func
completedAction
(){
if
currentMediaType
==
0
{
if
currentMediaType
==
.
compressPhoto
{
// 将压缩后的照片存到相册
// 将压缩后的照片存到相册
for
imageData
in
self
.
comDataSource
{
for
imageData
in
self
.
comDataSource
{
PHPhotoLibrary
.
shared
()
.
performChanges
({
PHPhotoLibrary
.
shared
()
.
performChanges
({
...
@@ -298,7 +298,7 @@ class CompressCompletedViewController : BaseViewController{
...
@@ -298,7 +298,7 @@ class CompressCompletedViewController : BaseViewController{
// 删除文件逻辑【系统自动提示是否删除】
// 删除文件逻辑【系统自动提示是否删除】
var
idents
:[
String
]
=
[]
var
idents
:[
String
]
=
[]
for
ele
in
self
.
model
!
{
for
ele
in
self
.
model
!
{
idents
.
append
(
ele
.
ident
)
idents
.
append
(
ele
.
localIdentifier
)
}
}
let
fetchResult
=
PHAsset
.
fetchAssets
(
withLocalIdentifiers
:
idents
,
options
:
nil
)
let
fetchResult
=
PHAsset
.
fetchAssets
(
withLocalIdentifiers
:
idents
,
options
:
nil
)
let
fileSize
=
FileTool
()
.
calculateTotalAssetSize
(
fetchResult
:
fetchResult
)
let
fileSize
=
FileTool
()
.
calculateTotalAssetSize
(
fetchResult
:
fetchResult
)
...
@@ -310,8 +310,8 @@ class CompressCompletedViewController : BaseViewController{
...
@@ -310,8 +310,8 @@ class CompressCompletedViewController : BaseViewController{
var
count
=
0
var
count
=
0
for
ele
in
self
.
model
!
{
for
ele
in
self
.
model
!
{
count
=
count
+
1
count
=
count
+
1
self
.
updateCompressData
(
flag
:
ele
.
ident
)
self
.
updateCompressData
(
flag
:
ele
.
localIdentifier
)
let
deleteModel
=
AssetModel
(
localIdentifier
:
ele
.
ident
,
assetSize
:
ele
.
org
Size
,
createDate
:
ele
.
createDate
)
let
deleteModel
=
AssetModel
(
localIdentifier
:
ele
.
localIdentifier
,
assetSize
:
ele
.
asset
Size
,
createDate
:
ele
.
createDate
)
models
.
append
(
deleteModel
)
models
.
append
(
deleteModel
)
}
}
if
(
success
){
if
(
success
){
...
@@ -355,9 +355,9 @@ class CompressCompletedViewController : BaseViewController{
...
@@ -355,9 +355,9 @@ class CompressCompletedViewController : BaseViewController{
DispatchQueue
.
main
.
async
{
DispatchQueue
.
main
.
async
{
// 移除VC中的数据
// 移除VC中的数据
let
compressVC
=
self
.
navigationController
?
.
viewControllers
.
first
(
where
:
{
$0
is
CompressController
})
as!
CompressController
as
CompressController
let
compressVC
=
self
.
navigationController
?
.
viewControllers
.
first
(
where
:
{
$0
is
CompressController
})
as!
CompressController
as
CompressController
compressVC
.
resourceData
.
removeAll
{
$0
.
ident
==
flag
}
compressVC
.
resourceData
.
removeAll
{
$0
.
localIdentifier
==
flag
}
// 移除单利中的数据
// 移除单利中的数据
Singleton
.
shared
.
resourceModel
.
removeAll
{
$0
.
ident
==
flag
}
Singleton
.
shared
.
resourceModel
.
removeAll
{
$0
.
localIdentifier
==
flag
}
}
}
}
}
...
...
PhoneManager/Class/Session/Compress/Controller/CompressController.swift
View file @
4a1b6582
...
@@ -10,6 +10,12 @@ import SnapKit
...
@@ -10,6 +10,12 @@ import SnapKit
import
Photos
import
Photos
import
SVProgressHUD
import
SVProgressHUD
enum
CompressType
{
case
compressVideo
case
compressPhoto
}
class
CompressController
:
BaseViewController
{
class
CompressController
:
BaseViewController
{
private
var
compressNav
:
CompressNavView
?
private
var
compressNav
:
CompressNavView
?
...
@@ -24,10 +30,10 @@ class CompressController : BaseViewController {
...
@@ -24,10 +30,10 @@ class CompressController : BaseViewController {
// 资源类型 - 相册或者视频
// 资源类型 - 相册或者视频
var
currentResourceType
:
Int
=
0
var
currentResourceType
:
CompressType
=
.
compressPhoto
// 所有的数据
// 所有的数据
var
resourceData
=
[
Resource
Model
](){
var
resourceData
=
[
Asset
Model
](){
didSet
{
didSet
{
DispatchQueue
.
main
.
async
{
DispatchQueue
.
main
.
async
{
self
.
collectionView
.
reloadData
()
self
.
collectionView
.
reloadData
()
...
@@ -36,7 +42,7 @@ class CompressController : BaseViewController {
...
@@ -36,7 +42,7 @@ class CompressController : BaseViewController {
}
}
// 当前页面选中的
// 当前页面选中的
var
selectedModel
:
[
Resource
Model
]
=
[]
var
selectedModel
:
[
Asset
Model
]
=
[]
lazy
var
collectionView
:
UICollectionView
=
{
lazy
var
collectionView
:
UICollectionView
=
{
...
@@ -117,9 +123,9 @@ class CompressController : BaseViewController {
...
@@ -117,9 +123,9 @@ class CompressController : BaseViewController {
if
datas
.
count
>
0
{
if
datas
.
count
>
0
{
// 这里需要重新排序下
// 这里需要重新排序下
if
self
.
currentSort
==
0
{
if
self
.
currentSort
==
0
{
self
.
resourceData
=
datas
.
sorted
{
$0
.
orgSize
>
$1
.
org
Size
}
self
.
resourceData
=
datas
.
sorted
{
$0
.
assetSize
>
$1
.
asset
Size
}
}
else
if
self
.
currentSort
==
1
{
}
else
if
self
.
currentSort
==
1
{
self
.
resourceData
=
datas
.
sorted
{
$0
.
orgSize
<
$1
.
org
Size
}
self
.
resourceData
=
datas
.
sorted
{
$0
.
assetSize
<
$1
.
asset
Size
}
}
else
if
self
.
currentSort
==
2
{
}
else
if
self
.
currentSort
==
2
{
self
.
resourceData
=
datas
.
sorted
{
$0
.
createDate
>
$1
.
createDate
}
self
.
resourceData
=
datas
.
sorted
{
$0
.
createDate
>
$1
.
createDate
}
}
else
{
}
else
{
...
@@ -166,13 +172,12 @@ extension CompressController:WaterfallMutiSectionDelegate,UICollectionViewDataSo
...
@@ -166,13 +172,12 @@ extension CompressController:WaterfallMutiSectionDelegate,UICollectionViewDataSo
func
collectionView
(
_
collectionView
:
UICollectionView
,
cellForItemAt
indexPath
:
IndexPath
)
->
UICollectionViewCell
{
func
collectionView
(
_
collectionView
:
UICollectionView
,
cellForItemAt
indexPath
:
IndexPath
)
->
UICollectionViewCell
{
let
cell
=
collectionView
.
dequeueReusableCell
(
withReuseIdentifier
:
"CompressSelectCell"
,
for
:
indexPath
)
as!
CompressSelectCell
let
cell
=
collectionView
.
dequeueReusableCell
(
withReuseIdentifier
:
"CompressSelectCell"
,
for
:
indexPath
)
as!
CompressSelectCell
cell
.
model
=
self
.
resourceData
[
indexPath
.
row
]
cell
.
currentMediaType
=
self
.
currentResourceType
cell
.
currentMediaType
=
self
.
currentResourceType
cell
.
model
=
self
.
resourceData
[
indexPath
.
row
]
if
self
.
selectedModel
.
count
==
0
{
if
self
.
selectedModel
.
count
==
0
{
cell
.
choose
=
false
cell
.
choose
=
false
}
}
cell
.
callBack
=
{[
weak
self
]
(
model
:
AssetModel
,
choose
:
Bool
)
->
()
in
cell
.
callBack
=
{[
weak
self
]
(
model
:
ResourceModel
,
choose
:
Bool
)
->
()
in
guard
let
self
else
{
return
}
guard
let
self
else
{
return
}
// 这里临时管理一个当前选择的资源
// 这里临时管理一个当前选择的资源
...
@@ -247,15 +252,15 @@ extension CompressController:WaterfallMutiSectionDelegate,UICollectionViewDataSo
...
@@ -247,15 +252,15 @@ extension CompressController:WaterfallMutiSectionDelegate,UICollectionViewDataSo
}
}
header
.
changeView
.
callBack
=
{[
weak
self
]
flag
in
header
.
changeView
.
callBack
=
{[
weak
self
]
flag
in
guard
let
self
else
{
return
}
guard
let
self
else
{
return
}
if
self
.
currentResourceType
!=
flag
as!
Int
{
if
self
.
currentResourceType
!=
flag
{
self
.
currentResourceType
=
flag
as!
Int
self
.
currentResourceType
=
flag
// 先移除下,防止点到
// 先移除下,防止点到
self
.
resourceData
.
removeAll
()
self
.
resourceData
.
removeAll
()
// 如果是图片,直接从缓存中加载
// 如果是图片,直接从缓存中加载
if
self
.
currentResourceType
==
0
{
if
self
.
currentResourceType
==
.
compressPhoto
{
self
.
getViewData
()
self
.
getViewData
()
}
else
{
}
else
{
CompressViewModel
()
.
getAllPhotosToAssets
(
sortType
:
self
.
currentSort
,
assetType
:
flag
as!
Int
)
{
[
weak
self
]
models
in
CompressViewModel
()
.
getAllPhotosToAssets
(
sortType
:
self
.
currentSort
,
assetType
:
flag
)
{
[
weak
self
]
models
in
guard
let
self
else
{
return
}
guard
let
self
else
{
return
}
self
.
resourceData
=
models
self
.
resourceData
=
models
}
}
...
@@ -308,7 +313,7 @@ extension CompressController:WaterfallMutiSectionDelegate,UICollectionViewDataSo
...
@@ -308,7 +313,7 @@ extension CompressController:WaterfallMutiSectionDelegate,UICollectionViewDataSo
func
updateSubmitButton
(){
func
updateSubmitButton
(){
if
self
.
selectedModel
.
count
>
0
{
if
self
.
selectedModel
.
count
>
0
{
self
.
submitButton
.
backgroundColor
=
UIColor
(
red
:
0
,
green
:
0.51
,
blue
:
1
,
alpha
:
1
)
self
.
submitButton
.
backgroundColor
=
UIColor
(
red
:
0
,
green
:
0.51
,
blue
:
1
,
alpha
:
1
)
if
self
.
currentResourceType
==
0
{
if
self
.
currentResourceType
==
.
compressPhoto
{
self
.
submitButton
.
setTitle
(
"Compress
\(
self
.
selectedModel
.
count
)
photos"
,
for
:
UIControl
.
State
.
normal
)
self
.
submitButton
.
setTitle
(
"Compress
\(
self
.
selectedModel
.
count
)
photos"
,
for
:
UIControl
.
State
.
normal
)
}
else
{
}
else
{
self
.
submitButton
.
setTitle
(
"Compress
\(
self
.
selectedModel
.
count
)
videos"
,
for
:
UIControl
.
State
.
normal
)
self
.
submitButton
.
setTitle
(
"Compress
\(
self
.
selectedModel
.
count
)
videos"
,
for
:
UIControl
.
State
.
normal
)
...
...
PhoneManager/Class/Session/Compress/Controller/CompressQualityController.swift
View file @
4a1b6582
...
@@ -9,9 +9,9 @@ import Foundation
...
@@ -9,9 +9,9 @@ import Foundation
class
CompressQualityController
:
BaseViewController
{
class
CompressQualityController
:
BaseViewController
{
var
model
:
[
Resource
Model
]?
{
var
model
:
[
Asset
Model
]?
{
didSet
{
didSet
{
let
ident
=
model
!.
first
!.
ident
let
ident
=
model
!.
first
!.
localIdentifier
let
image
=
PhotoAndVideoMananger
.
mananger
.
getImageFromAssetID
(
id
:
ident
)
let
image
=
PhotoAndVideoMananger
.
mananger
.
getImageFromAssetID
(
id
:
ident
)
self
.
imageView
.
image
=
image
self
.
imageView
.
image
=
image
}
}
...
@@ -20,7 +20,7 @@ class CompressQualityController : BaseViewController{
...
@@ -20,7 +20,7 @@ class CompressQualityController : BaseViewController{
var
currentQulityType
:
Int
=
0
var
currentQulityType
:
Int
=
0
var
currentMediaType
:
Int
=
0
var
currentMediaType
:
CompressType
=
.
compressPhoto
private
var
compressNav
:
CompressNavView
?
private
var
compressNav
:
CompressNavView
?
...
@@ -196,7 +196,7 @@ class CompressQualityController : BaseViewController{
...
@@ -196,7 +196,7 @@ class CompressQualityController : BaseViewController{
var
sum
=
0.0
var
sum
=
0.0
var
orgAllSize
=
0.0
var
orgAllSize
=
0.0
for
modelData
in
self
.
model
!
{
for
modelData
in
self
.
model
!
{
orgAllSize
=
orgAllSize
+
modelData
.
org
Size
orgAllSize
=
orgAllSize
+
modelData
.
asset
Size
}
}
sum
=
orgAllSize
-
compressAllSize
sum
=
orgAllSize
-
compressAllSize
sum
=
sum
/
1000
sum
=
sum
/
1000
...
@@ -236,7 +236,7 @@ class CompressQualityController : BaseViewController{
...
@@ -236,7 +236,7 @@ class CompressQualityController : BaseViewController{
}
}
var
comDataSource
:
[
Data
]
=
[]
var
comDataSource
:
[
Data
]
=
[]
if
self
.
currentMediaType
==
0
{
if
self
.
currentMediaType
==
.
compressPhoto
{
// 表示压缩图片
// 表示压缩图片
manager
.
compress
(
assets
:
self
.
model
!
,
compressionQuality
:
currentQulity
)
{
progress
in
manager
.
compress
(
assets
:
self
.
model
!
,
compressionQuality
:
currentQulity
)
{
progress
in
compressingView
.
animationView
.
setProgress
(
CGFloat
(
progress
),
animated
:
false
,
duration
:
0.1
)
compressingView
.
animationView
.
setProgress
(
CGFloat
(
progress
),
animated
:
false
,
duration
:
0.1
)
...
...
PhoneManager/Class/Session/Compress/Model/ResourceModel.swift
deleted
100644 → 0
View file @
210ea389
//
// ResourceModel.swift
// PhoneManager
//
// Created by edy on 2025/4/2.
//
import
Foundation
import
Photos
struct
ResourceModel
:
Equatable
{
var
ident
:
String
var
orgSize
:
Double
var
createDate
:
Date
init
(
ident
:
String
,
orgSize
:
Double
,
createDate
:
Date
)
{
self
.
ident
=
ident
self
.
orgSize
=
orgSize
self
.
createDate
=
createDate
}
}
PhoneManager/Class/Session/Compress/View/CompressCustomHeaderView.swift
View file @
4a1b6582
...
@@ -11,15 +11,15 @@ class CompressCustomHeaderView: UICollectionReusableView{
...
@@ -11,15 +11,15 @@ class CompressCustomHeaderView: UICollectionReusableView{
var
callBack
:
callBack
<
Any
>
=
{
text
in
}
var
callBack
:
callBack
<
Any
>
=
{
text
in
}
var
modeData
=
[
Resource
Model
]()
{
var
modeData
=
[
Asset
Model
]()
{
didSet
{
didSet
{
// 计算图片总大小
// 计算图片总大小
var
sum
=
0.0
var
sum
=
0.0
// 计算可节省大小
// 计算可节省大小
var
saveSum
=
0.0
var
saveSum
=
0.0
for
model
in
self
.
modeData
{
for
model
in
self
.
modeData
{
sum
=
sum
+
model
.
org
Size
sum
=
sum
+
model
.
asset
Size
saveSum
=
saveSum
+
model
.
org
Size
*
0.8
saveSum
=
saveSum
+
model
.
asset
Size
*
0.8
}
}
sum
=
sum
/
1000
sum
=
sum
/
1000
saveSum
=
saveSum
/
1000
saveSum
=
saveSum
/
1000
...
...
PhoneManager/Class/Session/Compress/View/CompressSwitchView.swift
View file @
4a1b6582
...
@@ -9,7 +9,7 @@ import Foundation
...
@@ -9,7 +9,7 @@ import Foundation
class
CompressSwitchView
:
UIView
{
class
CompressSwitchView
:
UIView
{
var
callBack
:
callBack
<
Any
>
=
{
flag
in
}
var
callBack
:
callBack
<
CompressType
>
=
{
flag
in
}
var
currentButton
:
UIButton
?
var
currentButton
:
UIButton
?
...
@@ -40,32 +40,23 @@ class CompressSwitchView : UIView {
...
@@ -40,32 +40,23 @@ class CompressSwitchView : UIView {
self
.
backgroundColor
=
.
clear
self
.
backgroundColor
=
.
clear
self
.
addSubview
(
self
.
leftButton
)
self
.
addSubview
(
self
.
leftButton
)
// // 暂时屏蔽
self
.
addSubview
(
self
.
rightButton
)
// self.addSubview(self.rightButton)
// self.leftButton.snp.makeConstraints { make in
// make.left.equalToSuperview().offset(4)
// make.top.equalToSuperview().offset(4)
// make.bottom.equalToSuperview().offset(-4)
// make.width.equalTo(self.snp.width).multipliedBy(0.5).offset(-6)
// }
//
// self.rightButton.snp.makeConstraints { make in
// make.right.equalToSuperview().offset(-4)
// make.top.equalToSuperview().offset(4)
// make.bottom.equalToSuperview().offset(-4)
// make.left.equalTo(self.leftButton.snp.right).offset(4)
// }
self
.
leftButton
.
snp
.
makeConstraints
{
make
in
self
.
leftButton
.
snp
.
makeConstraints
{
make
in
make
.
left
.
equalToSuperview
()
.
offset
(
4
)
make
.
left
.
equalToSuperview
()
.
offset
(
4
)
make
.
top
.
equalToSuperview
()
.
offset
(
4
)
make
.
top
.
equalToSuperview
()
.
offset
(
4
)
make
.
bottom
.
equalToSuperview
()
.
offset
(
-
4
)
make
.
bottom
.
equalToSuperview
()
.
offset
(
-
4
)
make
.
width
.
equalTo
(
self
.
snp
.
width
)
.
multipliedBy
(
0.5
)
.
offset
(
-
6
)
}
self
.
rightButton
.
snp
.
makeConstraints
{
make
in
make
.
right
.
equalToSuperview
()
.
offset
(
-
4
)
make
.
right
.
equalToSuperview
()
.
offset
(
-
4
)
make
.
top
.
equalToSuperview
()
.
offset
(
4
)
make
.
bottom
.
equalToSuperview
()
.
offset
(
-
4
)
make
.
left
.
equalTo
(
self
.
leftButton
.
snp
.
right
)
.
offset
(
4
)
}
}
// 初始化的时候设置默认值
// 初始化的时候设置默认值
self
.
currentButton
=
self
.
leftButton
self
.
currentButton
=
self
.
leftButton
self
.
currentButton
?
.
setTitleColor
(
UIColor
(
red
:
0
,
green
:
0.51
,
blue
:
1
,
alpha
:
1
),
for
:
.
normal
)
self
.
currentButton
?
.
setTitleColor
(
UIColor
(
red
:
0
,
green
:
0.51
,
blue
:
1
,
alpha
:
1
),
for
:
.
normal
)
...
@@ -88,8 +79,12 @@ class CompressSwitchView : UIView {
...
@@ -88,8 +79,12 @@ class CompressSwitchView : UIView {
sender
.
setTitleColor
(
UIColor
(
red
:
0
,
green
:
0.51
,
blue
:
1
,
alpha
:
1
),
for
:
.
normal
)
sender
.
setTitleColor
(
UIColor
(
red
:
0
,
green
:
0.51
,
blue
:
1
,
alpha
:
1
),
for
:
.
normal
)
sender
.
backgroundColor
=
.
white
sender
.
backgroundColor
=
.
white
self
.
currentButton
=
sender
self
.
currentButton
=
sender
if
(
sender
.
tag
-
1000
)
==
0
{
self
.
callBack
(
.
compressPhoto
)
}
else
{
self
.
callBack
(
.
compressVideo
)
}
self
.
callBack
(
sender
.
tag
-
1000
)
}
}
}
}
PhoneManager/Class/Session/Compress/View/CompressingView.swift
View file @
4a1b6582
...
@@ -10,7 +10,7 @@ import Foundation
...
@@ -10,7 +10,7 @@ import Foundation
class
CompressingView
:
UIView
{
class
CompressingView
:
UIView
{
var
data
:
[
Resource
Model
]?
var
data
:
[
Asset
Model
]?
override
init
(
frame
:
CGRect
)
{
override
init
(
frame
:
CGRect
)
{
super
.
init
(
frame
:
frame
)
super
.
init
(
frame
:
frame
)
...
...
PhoneManager/Class/Session/Compress/ViewModel/CompressViewModel.swift
View file @
4a1b6582
...
@@ -9,7 +9,7 @@ import Foundation
...
@@ -9,7 +9,7 @@ import Foundation
import
Photos
import
Photos
typealias
Finished
=
([
Resource
Model
])
->
Void
typealias
Finished
=
([
Asset
Model
])
->
Void
struct
PhotoInfo
{
struct
PhotoInfo
{
var
localIdentifier
:
String
var
localIdentifier
:
String
...
@@ -67,15 +67,15 @@ class CompressViewModel{
...
@@ -67,15 +67,15 @@ class CompressViewModel{
/// 获取相册所有图片
/// 获取相册所有图片
/// - Returns: 图片信息
/// - Returns: 图片信息
func
getAllPhotosToAssets
(
sortType
:
Int
,
assetType
:
Int
,
_
finished
:
@escaping
Finished
){
func
getAllPhotosToAssets
(
sortType
:
Int
,
assetType
:
CompressType
,
_
finished
:
@escaping
Finished
){
var
models
:
[
Resource
Model
]
=
[]
var
models
:
[
Asset
Model
]
=
[]
let
fetchOptions
=
PHFetchOptions
()
let
fetchOptions
=
PHFetchOptions
()
fetchOptions
.
sortDescriptors
=
[
NSSortDescriptor
(
key
:
"creationDate"
,
ascending
:
false
)]
fetchOptions
.
sortDescriptors
=
[
NSSortDescriptor
(
key
:
"creationDate"
,
ascending
:
false
)]
var
photosAssets
:
PHFetchResult
<
PHAsset
>
var
photosAssets
:
PHFetchResult
<
PHAsset
>
if
assetType
==
0
{
if
assetType
==
.
compressPhoto
{
photosAssets
=
PHAsset
.
fetchAssets
(
with
:
.
image
,
options
:
fetchOptions
)
photosAssets
=
PHAsset
.
fetchAssets
(
with
:
.
image
,
options
:
fetchOptions
)
}
else
{
}
else
{
photosAssets
=
PHAsset
.
fetchAssets
(
with
:
.
video
,
options
:
fetchOptions
)
photosAssets
=
PHAsset
.
fetchAssets
(
with
:
.
video
,
options
:
fetchOptions
)
...
@@ -102,16 +102,16 @@ class CompressViewModel{
...
@@ -102,16 +102,16 @@ class CompressViewModel{
// 获取图片的localIdentifier
// 获取图片的localIdentifier
let
localIdentifier
=
asset
.
localIdentifier
let
localIdentifier
=
asset
.
localIdentifier
let
model
=
ResourceModel
.
init
(
ident
:
localIdentifier
,
org
Size
:
Double
(
sizeInMB
),
createDate
:
creationDate
)
let
model
=
AssetModel
.
init
(
localIdentifier
:
localIdentifier
,
asset
Size
:
Double
(
sizeInMB
),
createDate
:
creationDate
)
models
.
append
(
model
)
models
.
append
(
model
)
count
=
count
+
1
count
=
count
+
1
group
.
leave
()
group
.
leave
()
if
count
==
assetsArray
.
count
{
if
count
==
assetsArray
.
count
{
// 默认按照文件大小排序
// 默认按照文件大小排序
if
sortType
==
0
{
if
sortType
==
0
{
finished
(
models
.
sorted
{
$0
.
orgSize
>
$1
.
org
Size
})
finished
(
models
.
sorted
{
$0
.
assetSize
>
$1
.
asset
Size
})
}
else
if
sortType
==
1
{
}
else
if
sortType
==
1
{
finished
(
models
.
sorted
{
$0
.
orgSize
<
$1
.
org
Size
})
finished
(
models
.
sorted
{
$0
.
assetSize
<
$1
.
asset
Size
})
}
else
if
sortType
==
2
{
}
else
if
sortType
==
2
{
finished
(
models
.
sorted
{
$0
.
createDate
>
$1
.
createDate
})
finished
(
models
.
sorted
{
$0
.
createDate
>
$1
.
createDate
})
}
else
{
}
else
{
...
@@ -129,12 +129,12 @@ class CompressViewModel{
...
@@ -129,12 +129,12 @@ class CompressViewModel{
/// - sortType: 排序的类型,升序或者降序。0-升序,1-降序
/// - sortType: 排序的类型,升序或者降序。0-升序,1-降序
/// - sortKind: 排序的种类 大小或者时间 0-大小,1-时间
/// - sortKind: 排序的种类 大小或者时间 0-大小,1-时间
/// - Returns: 返回排序结果
/// - Returns: 返回排序结果
func
sortRsource
(
resource
:[
ResourceModel
],
sortType
:
Int
,
sortKind
:
Int
)
->
[
Resource
Model
]{
func
sortRsource
(
resource
:[
AssetModel
],
sortType
:
Int
,
sortKind
:
Int
)
->
[
Asset
Model
]{
if
sortKind
==
0
{
if
sortKind
==
0
{
if
sortType
==
0
{
if
sortType
==
0
{
return
resource
.
sorted
{
$0
.
orgSize
<
$1
.
org
Size
}
return
resource
.
sorted
{
$0
.
assetSize
<
$1
.
asset
Size
}
}
else
{
}
else
{
return
resource
.
sorted
{
$0
.
orgSize
>
$1
.
org
Size
}
return
resource
.
sorted
{
$0
.
assetSize
>
$1
.
asset
Size
}
}
}
}
else
{
}
else
{
if
sortType
==
0
{
if
sortType
==
0
{
...
@@ -153,7 +153,7 @@ class CompressViewModel{
...
@@ -153,7 +153,7 @@ class CompressViewModel{
/// - quality: 要锁质量
/// - quality: 要锁质量
/// - progress: 进度回调
/// - progress: 进度回调
/// - completion: 完成回调
/// - completion: 完成回调
func
compressVideos
(
models
:
[
Resource
Model
],
quality
:
Float
,
func
compressVideos
(
models
:
[
Asset
Model
],
quality
:
Float
,
progress
:
@escaping
(
String
,
Float
)
->
Void
,
progress
:
@escaping
(
String
,
Float
)
->
Void
,
completion
:
@escaping
([
URL
?],
[
Error
?])
->
Void
)
{
completion
:
@escaping
([
URL
?],
[
Error
?])
->
Void
)
{
var
outputURLs
:
[
URL
?]
=
Array
(
repeating
:
nil
,
count
:
models
.
count
)
var
outputURLs
:
[
URL
?]
=
Array
(
repeating
:
nil
,
count
:
models
.
count
)
...
@@ -168,7 +168,7 @@ class CompressViewModel{
...
@@ -168,7 +168,7 @@ class CompressViewModel{
let
model
=
models
[
index
]
let
model
=
models
[
index
]
let
fetchOptions
=
PHFetchOptions
()
let
fetchOptions
=
PHFetchOptions
()
let
assets
=
PHAsset
.
fetchAssets
(
withLocalIdentifiers
:
[
model
.
ident
],
options
:
fetchOptions
)
let
assets
=
PHAsset
.
fetchAssets
(
withLocalIdentifiers
:
[
model
.
localIdentifier
],
options
:
fetchOptions
)
guard
let
asset
=
assets
.
firstObject
else
{
guard
let
asset
=
assets
.
firstObject
else
{
errors
[
index
]
=
NSError
(
domain
:
"VideoCompressor"
,
code
:
1
,
userInfo
:
[
NSLocalizedDescriptionKey
:
"Asset not found"
])
errors
[
index
]
=
NSError
(
domain
:
"VideoCompressor"
,
code
:
1
,
userInfo
:
[
NSLocalizedDescriptionKey
:
"Asset not found"
])
completedCount
+=
1
completedCount
+=
1
...
@@ -275,7 +275,7 @@ class CompressViewModel{
...
@@ -275,7 +275,7 @@ class CompressViewModel{
exportSession
.
videoComposition
=
videoComposition
exportSession
.
videoComposition
=
videoComposition
let
progressTimer
=
Timer
.
scheduledTimer
(
withTimeInterval
:
0.1
,
repeats
:
true
)
{
timer
in
let
progressTimer
=
Timer
.
scheduledTimer
(
withTimeInterval
:
0.1
,
repeats
:
true
)
{
timer
in
progress
(
model
.
ident
,
exportSession
.
progress
)
progress
(
model
.
localIdentifier
,
exportSession
.
progress
)
}
}
exportSession
.
exportAsynchronously
{
exportSession
.
exportAsynchronously
{
...
@@ -312,7 +312,7 @@ class CompressViewModel{
...
@@ -312,7 +312,7 @@ class CompressViewModel{
/// - compressionQuality: 图片质量
/// - compressionQuality: 图片质量
/// - progressHandler: 进度
/// - progressHandler: 进度
/// - completion: 完成
/// - completion: 完成
func
compress
(
assets
:
[
Resource
Model
],
compressionQuality
:
CGFloat
,
progressHandler
:
@escaping
(
Float
)
->
Void
,
completion
:
@escaping
([
Data
?],
[
Error
?])
->
Void
)
{
func
compress
(
assets
:
[
Asset
Model
],
compressionQuality
:
CGFloat
,
progressHandler
:
@escaping
(
Float
)
->
Void
,
completion
:
@escaping
([
Data
?],
[
Error
?])
->
Void
)
{
var
compressedDataArray
:
[
Data
?]
=
Array
(
repeating
:
nil
,
count
:
assets
.
count
)
var
compressedDataArray
:
[
Data
?]
=
Array
(
repeating
:
nil
,
count
:
assets
.
count
)
var
errorArray
:
[
Error
?]
=
Array
(
repeating
:
nil
,
count
:
assets
.
count
)
var
errorArray
:
[
Error
?]
=
Array
(
repeating
:
nil
,
count
:
assets
.
count
)
...
@@ -320,7 +320,7 @@ class CompressViewModel{
...
@@ -320,7 +320,7 @@ class CompressViewModel{
let
totalCount
=
assets
.
count
let
totalCount
=
assets
.
count
for
(
index
,
model
)
in
assets
.
enumerated
()
{
for
(
index
,
model
)
in
assets
.
enumerated
()
{
let
fetchResult
=
PHAsset
.
fetchAssets
(
withLocalIdentifiers
:
[
model
.
ident
],
options
:
nil
)
let
fetchResult
=
PHAsset
.
fetchAssets
(
withLocalIdentifiers
:
[
model
.
localIdentifier
],
options
:
nil
)
compressSingleAsset
(
fetchResult
.
firstObject
!
,
compressionQuality
)
{
(
progress
)
in
compressSingleAsset
(
fetchResult
.
firstObject
!
,
compressionQuality
)
{
(
progress
)
in
let
singleProgress
=
Float
(
completedCount
)
/
Float
(
totalCount
)
+
progress
/
Float
(
totalCount
)
let
singleProgress
=
Float
(
completedCount
)
/
Float
(
totalCount
)
+
progress
/
Float
(
totalCount
)
progressHandler
(
singleProgress
)
progressHandler
(
singleProgress
)
...
...
PhoneManager/Class/Session/Home/Controller/HomePhotosDetailViewController.swift
View file @
4a1b6582
...
@@ -45,7 +45,7 @@ class HomePhotosDetailViewController : BaseViewController {
...
@@ -45,7 +45,7 @@ class HomePhotosDetailViewController : BaseViewController {
var
model
:
HomePhotosModel
var
model
:
HomePhotosModel
var
datas
:
[
Resource
Model
]
=
[]
var
datas
:
[
Asset
Model
]
=
[]
// 排序
// 排序
var
currentSort
:
Int
=
0
{
var
currentSort
:
Int
=
0
{
...
...
PhoneManager/Class/Session/Home/View/Model/HomePhotosModel .swift
View file @
4a1b6582
...
@@ -113,7 +113,7 @@ class PhotoDataManager {
...
@@ -113,7 +113,7 @@ class PhotoDataManager {
})
})
// 将单利中的数据也删除
// 将单利中的数据也删除
for
item
in
data
{
for
item
in
data
{
Singleton
.
shared
.
resourceModel
.
removeAll
{
$0
.
ident
==
item
.
localIdentifier
}
Singleton
.
shared
.
resourceModel
.
removeAll
{
$0
.
localIdentifier
==
item
.
localIdentifier
}
}
}
}
}
...
...
PhoneManager/Class/Tool/Class/PhotoAndVideoMananger/PhotoAndVideoMananger.swift
View file @
4a1b6582
...
@@ -899,7 +899,7 @@ class PhotoAndVideoMananger {
...
@@ -899,7 +899,7 @@ class PhotoAndVideoMananger {
// 获取当前版本的照片或视频
// 获取当前版本的照片或视频
options
.
version
=
.
current
options
.
version
=
.
current
// 尽可能快地提供结果
// 尽可能快地提供结果
options
.
deliveryMode
=
.
fast
Format
options
.
deliveryMode
=
.
highQuality
Format
// 允许从iCloud请求
// 允许从iCloud请求
options
.
isNetworkAccessAllowed
=
true
options
.
isNetworkAccessAllowed
=
true
// 异步请求
// 异步请求
...
...
PhoneManager/Class/Tool/Singleton/Singleton.swift
View file @
4a1b6582
...
@@ -14,7 +14,7 @@ class Singleton {
...
@@ -14,7 +14,7 @@ class Singleton {
// 私有化初始化方法,防止外部创建新实例
// 私有化初始化方法,防止外部创建新实例
private
init
()
{}
private
init
()
{}
var
resourceModel
:
[
Resource
Model
]
=
[]
var
resourceModel
:
[
Asset
Model
]
=
[]
var
maxDeleteCount
:
Int
=
25
var
maxDeleteCount
:
Int
=
25
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment