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 @@
import
Foundation
import
Photos
typealias
CompressSelectCellCallback
=
(
ResourceModel
,
Bool
)
->
Void
typealias
CompressSelectCellCallback
=
(
AssetModel
,
Bool
)
->
Void
class
CompressSelectCell
:
UICollectionViewCell
{
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
{
guard
let
model
=
self
.
model
else
{
return
}
self
.
backImageView
.
image
=
UIImage
()
let
viewModel
=
CompressViewModel
()
viewModel
.
getImageFromAssetIdentifier
(
identifier
:
model
.
ident
)
{[
weak
self
]
image
in
guard
let
self
else
{
return
}
DispatchQueue
.
main
.
async
{
self
.
backImageView
.
image
=
image
if
self
.
currentMediaType
==
.
compressPhoto
{
let
viewModel
=
CompressViewModel
()
viewModel
.
getImageFromAssetIdentifier
(
identifier
:
model
.
localIdentifier
)
{[
weak
self
]
image
in
guard
let
self
else
{
return
}
DispatchQueue
.
main
.
async
{
self
.
backImageView
.
image
=
image
}
}
}
else
{
PhotoAndVideoMananger
.
mananger
.
getVideoImageByIdent
(
ident
:
model
)
{
image
in
DispatchQueue
.
main
.
async
{
self
.
backImageView
.
image
=
image
}
}
errorHandler
:
{
print
(
"获取视频图片资源失败"
)
}
}
// 这里不再进行计算了 直接按照50%的去计算
let
saveSize
=
model
.
org
Size
/
2
let
saveSize
=
model
.
asset
Size
/
2
let
sizeKB
:
Double
=
saveSize
/
1000
DispatchQueue
.
main
.
async
{
if
sizeKB
<
1000
{
...
...
@@ -65,6 +89,15 @@ class CompressSelectCell : UICollectionViewCell {
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
=
{
let
view
=
UIView
()
...
...
@@ -127,6 +160,7 @@ class CompressSelectCell : UICollectionViewCell {
self
.
addGestureRecognizer
(
tap
)
self
.
addSubview
(
self
.
backImageView
)
self
.
backImageView
.
addSubview
(
self
.
playImageView
)
self
.
addSubview
(
self
.
saveSizeView
)
self
.
saveSizeView
.
addSubview
(
self
.
saveSizeLabel
)
self
.
saveSizeView
.
addSubview
(
self
.
moreImageView
)
...
...
@@ -137,6 +171,10 @@ class CompressSelectCell : UICollectionViewCell {
self
.
backImageView
.
snp
.
makeConstraints
{
make
in
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
make
.
left
.
equalToSuperview
()
.
offset
(
12
)
make
.
bottom
.
equalToSuperview
()
.
offset
(
-
12
)
...
...
@@ -176,16 +214,79 @@ class CompressSelectCell : UICollectionViewCell {
@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
{
// 如果是视频
let
vc
:
PreVideoController
=
PreVideoController
(
localIdentifier
:
self
.
model
!.
ident
)
self
.
responderViewController
()?
.
navigationController
?
.
pushViewController
(
vc
,
animated
:
true
)
}
// let vc : PreVideoController = PreVideoController(localIdentifier: self.model!.localIdentifier)
// 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
class
CompressCompletedViewController
:
BaseViewController
{
var
model
:
[
Resource
Model
]?
var
model
:
[
Asset
Model
]?
var
comDataSource
:
[
Data
]
=
[]
var
comVideoDataSource
:
[
URL
?]
=
[]
var
currentMediaType
:
Int
=
0
var
currentMediaType
:
CompressType
=
.
compressPhoto
lazy
var
animationView
:
LottieAnimationView
=
{
let
animationView
=
LottieAnimationView
(
name
:
"CompressCompletedLight"
)
...
...
@@ -256,7 +256,7 @@ class CompressCompletedViewController : BaseViewController{
}
@objc
func
completedAction
(){
if
currentMediaType
==
0
{
if
currentMediaType
==
.
compressPhoto
{
// 将压缩后的照片存到相册
for
imageData
in
self
.
comDataSource
{
PHPhotoLibrary
.
shared
()
.
performChanges
({
...
...
@@ -298,7 +298,7 @@ class CompressCompletedViewController : BaseViewController{
// 删除文件逻辑【系统自动提示是否删除】
var
idents
:[
String
]
=
[]
for
ele
in
self
.
model
!
{
idents
.
append
(
ele
.
ident
)
idents
.
append
(
ele
.
localIdentifier
)
}
let
fetchResult
=
PHAsset
.
fetchAssets
(
withLocalIdentifiers
:
idents
,
options
:
nil
)
let
fileSize
=
FileTool
()
.
calculateTotalAssetSize
(
fetchResult
:
fetchResult
)
...
...
@@ -310,8 +310,8 @@ class CompressCompletedViewController : BaseViewController{
var
count
=
0
for
ele
in
self
.
model
!
{
count
=
count
+
1
self
.
updateCompressData
(
flag
:
ele
.
ident
)
let
deleteModel
=
AssetModel
(
localIdentifier
:
ele
.
ident
,
assetSize
:
ele
.
org
Size
,
createDate
:
ele
.
createDate
)
self
.
updateCompressData
(
flag
:
ele
.
localIdentifier
)
let
deleteModel
=
AssetModel
(
localIdentifier
:
ele
.
localIdentifier
,
assetSize
:
ele
.
asset
Size
,
createDate
:
ele
.
createDate
)
models
.
append
(
deleteModel
)
}
if
(
success
){
...
...
@@ -355,9 +355,9 @@ class CompressCompletedViewController : BaseViewController{
DispatchQueue
.
main
.
async
{
// 移除VC中的数据
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
import
Photos
import
SVProgressHUD
enum
CompressType
{
case
compressVideo
case
compressPhoto
}
class
CompressController
:
BaseViewController
{
private
var
compressNav
:
CompressNavView
?
...
...
@@ -24,10 +30,10 @@ class CompressController : BaseViewController {
// 资源类型 - 相册或者视频
var
currentResourceType
:
Int
=
0
var
currentResourceType
:
CompressType
=
.
compressPhoto
// 所有的数据
var
resourceData
=
[
Resource
Model
](){
var
resourceData
=
[
Asset
Model
](){
didSet
{
DispatchQueue
.
main
.
async
{
self
.
collectionView
.
reloadData
()
...
...
@@ -36,7 +42,7 @@ class CompressController : BaseViewController {
}
// 当前页面选中的
var
selectedModel
:
[
Resource
Model
]
=
[]
var
selectedModel
:
[
Asset
Model
]
=
[]
lazy
var
collectionView
:
UICollectionView
=
{
...
...
@@ -117,9 +123,9 @@ class CompressController : BaseViewController {
if
datas
.
count
>
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
{
self
.
resourceData
=
datas
.
sorted
{
$0
.
orgSize
<
$1
.
org
Size
}
self
.
resourceData
=
datas
.
sorted
{
$0
.
assetSize
<
$1
.
asset
Size
}
}
else
if
self
.
currentSort
==
2
{
self
.
resourceData
=
datas
.
sorted
{
$0
.
createDate
>
$1
.
createDate
}
}
else
{
...
...
@@ -166,13 +172,12 @@ extension CompressController:WaterfallMutiSectionDelegate,UICollectionViewDataSo
func
collectionView
(
_
collectionView
:
UICollectionView
,
cellForItemAt
indexPath
:
IndexPath
)
->
UICollectionViewCell
{
let
cell
=
collectionView
.
dequeueReusableCell
(
withReuseIdentifier
:
"CompressSelectCell"
,
for
:
indexPath
)
as!
CompressSelectCell
cell
.
model
=
self
.
resourceData
[
indexPath
.
row
]
cell
.
currentMediaType
=
self
.
currentResourceType
cell
.
model
=
self
.
resourceData
[
indexPath
.
row
]
if
self
.
selectedModel
.
count
==
0
{
cell
.
choose
=
false
}
cell
.
callBack
=
{[
weak
self
]
(
model
:
ResourceModel
,
choose
:
Bool
)
->
()
in
cell
.
callBack
=
{[
weak
self
]
(
model
:
AssetModel
,
choose
:
Bool
)
->
()
in
guard
let
self
else
{
return
}
// 这里临时管理一个当前选择的资源
...
...
@@ -247,15 +252,15 @@ extension CompressController:WaterfallMutiSectionDelegate,UICollectionViewDataSo
}
header
.
changeView
.
callBack
=
{[
weak
self
]
flag
in
guard
let
self
else
{
return
}
if
self
.
currentResourceType
!=
flag
as!
Int
{
self
.
currentResourceType
=
flag
as!
Int
if
self
.
currentResourceType
!=
flag
{
self
.
currentResourceType
=
flag
// 先移除下,防止点到
self
.
resourceData
.
removeAll
()
// 如果是图片,直接从缓存中加载
if
self
.
currentResourceType
==
0
{
if
self
.
currentResourceType
==
.
compressPhoto
{
self
.
getViewData
()
}
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
}
self
.
resourceData
=
models
}
...
...
@@ -308,7 +313,7 @@ extension CompressController:WaterfallMutiSectionDelegate,UICollectionViewDataSo
func
updateSubmitButton
(){
if
self
.
selectedModel
.
count
>
0
{
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
)
}
else
{
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
class
CompressQualityController
:
BaseViewController
{
var
model
:
[
Resource
Model
]?
{
var
model
:
[
Asset
Model
]?
{
didSet
{
let
ident
=
model
!.
first
!.
ident
let
ident
=
model
!.
first
!.
localIdentifier
let
image
=
PhotoAndVideoMananger
.
mananger
.
getImageFromAssetID
(
id
:
ident
)
self
.
imageView
.
image
=
image
}
...
...
@@ -20,7 +20,7 @@ class CompressQualityController : BaseViewController{
var
currentQulityType
:
Int
=
0
var
currentMediaType
:
Int
=
0
var
currentMediaType
:
CompressType
=
.
compressPhoto
private
var
compressNav
:
CompressNavView
?
...
...
@@ -196,7 +196,7 @@ class CompressQualityController : BaseViewController{
var
sum
=
0.0
var
orgAllSize
=
0.0
for
modelData
in
self
.
model
!
{
orgAllSize
=
orgAllSize
+
modelData
.
org
Size
orgAllSize
=
orgAllSize
+
modelData
.
asset
Size
}
sum
=
orgAllSize
-
compressAllSize
sum
=
sum
/
1000
...
...
@@ -236,7 +236,7 @@ class CompressQualityController : BaseViewController{
}
var
comDataSource
:
[
Data
]
=
[]
if
self
.
currentMediaType
==
0
{
if
self
.
currentMediaType
==
.
compressPhoto
{
// 表示压缩图片
manager
.
compress
(
assets
:
self
.
model
!
,
compressionQuality
:
currentQulity
)
{
progress
in
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{
var
callBack
:
callBack
<
Any
>
=
{
text
in
}
var
modeData
=
[
Resource
Model
]()
{
var
modeData
=
[
Asset
Model
]()
{
didSet
{
// 计算图片总大小
var
sum
=
0.0
// 计算可节省大小
var
saveSum
=
0.0
for
model
in
self
.
modeData
{
sum
=
sum
+
model
.
org
Size
saveSum
=
saveSum
+
model
.
org
Size
*
0.8
sum
=
sum
+
model
.
asset
Size
saveSum
=
saveSum
+
model
.
asset
Size
*
0.8
}
sum
=
sum
/
1000
saveSum
=
saveSum
/
1000
...
...
PhoneManager/Class/Session/Compress/View/CompressSwitchView.swift
View file @
4a1b6582
...
...
@@ -9,7 +9,7 @@ import Foundation
class
CompressSwitchView
:
UIView
{
var
callBack
:
callBack
<
Any
>
=
{
flag
in
}
var
callBack
:
callBack
<
CompressType
>
=
{
flag
in
}
var
currentButton
:
UIButton
?
...
...
@@ -40,32 +40,23 @@ class CompressSwitchView : UIView {
self
.
backgroundColor
=
.
clear
self
.
addSubview
(
self
.
leftButton
)
// // 暂时屏蔽
// 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
.
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
.
currentButton
=
self
.
leftButton
self
.
currentButton
?
.
setTitleColor
(
UIColor
(
red
:
0
,
green
:
0.51
,
blue
:
1
,
alpha
:
1
),
for
:
.
normal
)
...
...
@@ -88,8 +79,12 @@ class CompressSwitchView : UIView {
sender
.
setTitleColor
(
UIColor
(
red
:
0
,
green
:
0.51
,
blue
:
1
,
alpha
:
1
),
for
:
.
normal
)
sender
.
backgroundColor
=
.
white
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
class
CompressingView
:
UIView
{
var
data
:
[
Resource
Model
]?
var
data
:
[
Asset
Model
]?
override
init
(
frame
:
CGRect
)
{
super
.
init
(
frame
:
frame
)
...
...
PhoneManager/Class/Session/Compress/ViewModel/CompressViewModel.swift
View file @
4a1b6582
...
...
@@ -9,7 +9,7 @@ import Foundation
import
Photos
typealias
Finished
=
([
Resource
Model
])
->
Void
typealias
Finished
=
([
Asset
Model
])
->
Void
struct
PhotoInfo
{
var
localIdentifier
:
String
...
...
@@ -67,15 +67,15 @@ class CompressViewModel{
/// 获取相册所有图片
/// - 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
()
fetchOptions
.
sortDescriptors
=
[
NSSortDescriptor
(
key
:
"creationDate"
,
ascending
:
false
)]
var
photosAssets
:
PHFetchResult
<
PHAsset
>
if
assetType
==
0
{
if
assetType
==
.
compressPhoto
{
photosAssets
=
PHAsset
.
fetchAssets
(
with
:
.
image
,
options
:
fetchOptions
)
}
else
{
photosAssets
=
PHAsset
.
fetchAssets
(
with
:
.
video
,
options
:
fetchOptions
)
...
...
@@ -102,16 +102,16 @@ class CompressViewModel{
// 获取图片的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
)
count
=
count
+
1
group
.
leave
()
if
count
==
assetsArray
.
count
{
// 默认按照文件大小排序
if
sortType
==
0
{
finished
(
models
.
sorted
{
$0
.
orgSize
>
$1
.
org
Size
})
finished
(
models
.
sorted
{
$0
.
assetSize
>
$1
.
asset
Size
})
}
else
if
sortType
==
1
{
finished
(
models
.
sorted
{
$0
.
orgSize
<
$1
.
org
Size
})
finished
(
models
.
sorted
{
$0
.
assetSize
<
$1
.
asset
Size
})
}
else
if
sortType
==
2
{
finished
(
models
.
sorted
{
$0
.
createDate
>
$1
.
createDate
})
}
else
{
...
...
@@ -129,12 +129,12 @@ class CompressViewModel{
/// - sortType: 排序的类型,升序或者降序。0-升序,1-降序
/// - sortKind: 排序的种类 大小或者时间 0-大小,1-时间
/// - 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
sortType
==
0
{
return
resource
.
sorted
{
$0
.
orgSize
<
$1
.
org
Size
}
return
resource
.
sorted
{
$0
.
assetSize
<
$1
.
asset
Size
}
}
else
{
return
resource
.
sorted
{
$0
.
orgSize
>
$1
.
org
Size
}
return
resource
.
sorted
{
$0
.
assetSize
>
$1
.
asset
Size
}
}
}
else
{
if
sortType
==
0
{
...
...
@@ -153,7 +153,7 @@ class CompressViewModel{
/// - quality: 要锁质量
/// - progress: 进度回调
/// - completion: 完成回调
func
compressVideos
(
models
:
[
Resource
Model
],
quality
:
Float
,
func
compressVideos
(
models
:
[
Asset
Model
],
quality
:
Float
,
progress
:
@escaping
(
String
,
Float
)
->
Void
,
completion
:
@escaping
([
URL
?],
[
Error
?])
->
Void
)
{
var
outputURLs
:
[
URL
?]
=
Array
(
repeating
:
nil
,
count
:
models
.
count
)
...
...
@@ -168,7 +168,7 @@ class CompressViewModel{
let
model
=
models
[
index
]
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
{
errors
[
index
]
=
NSError
(
domain
:
"VideoCompressor"
,
code
:
1
,
userInfo
:
[
NSLocalizedDescriptionKey
:
"Asset not found"
])
completedCount
+=
1
...
...
@@ -275,7 +275,7 @@ class CompressViewModel{
exportSession
.
videoComposition
=
videoComposition
let
progressTimer
=
Timer
.
scheduledTimer
(
withTimeInterval
:
0.1
,
repeats
:
true
)
{
timer
in
progress
(
model
.
ident
,
exportSession
.
progress
)
progress
(
model
.
localIdentifier
,
exportSession
.
progress
)
}
exportSession
.
exportAsynchronously
{
...
...
@@ -312,7 +312,7 @@ class CompressViewModel{
/// - compressionQuality: 图片质量
/// - progressHandler: 进度
/// - 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
errorArray
:
[
Error
?]
=
Array
(
repeating
:
nil
,
count
:
assets
.
count
)
...
...
@@ -320,7 +320,7 @@ class CompressViewModel{
let
totalCount
=
assets
.
count
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
let
singleProgress
=
Float
(
completedCount
)
/
Float
(
totalCount
)
+
progress
/
Float
(
totalCount
)
progressHandler
(
singleProgress
)
...
...
PhoneManager/Class/Session/Home/Controller/HomePhotosDetailViewController.swift
View file @
4a1b6582
...
...
@@ -45,7 +45,7 @@ class HomePhotosDetailViewController : BaseViewController {
var
model
:
HomePhotosModel
var
datas
:
[
Resource
Model
]
=
[]
var
datas
:
[
Asset
Model
]
=
[]
// 排序
var
currentSort
:
Int
=
0
{
...
...
PhoneManager/Class/Session/Home/View/Model/HomePhotosModel .swift
View file @
4a1b6582
...
...
@@ -113,7 +113,7 @@ class PhotoDataManager {
})
// 将单利中的数据也删除
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 {
// 获取当前版本的照片或视频
options
.
version
=
.
current
// 尽可能快地提供结果
options
.
deliveryMode
=
.
fast
Format
options
.
deliveryMode
=
.
highQuality
Format
// 允许从iCloud请求
options
.
isNetworkAccessAllowed
=
true
// 异步请求
...
...
PhoneManager/Class/Tool/Singleton/Singleton.swift
View file @
4a1b6582
...
...
@@ -14,7 +14,7 @@ class Singleton {
// 私有化初始化方法,防止外部创建新实例
private
init
()
{}
var
resourceModel
:
[
Resource
Model
]
=
[]
var
resourceModel
:
[
Asset
Model
]
=
[]
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