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
36283345
Commit
36283345
authored
May 21, 2025
by
CZ1004
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
【优化】时间选择器
parent
545b78fb
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
286 additions
and
110 deletions
+286
-110
PhotoRemoveViewController.swift
...lass/Page/Home/Controller/PhotoRemoveViewController.swift
+10
-4
DateSelectButtonView.swift
PhoneManager/Class/Page/Home/View/DateSelectButtonView.swift
+1
-1
PhotosRemoveBaseView.swift
PhoneManager/Class/Page/Home/View/PhotosRemoveBaseView.swift
+44
-19
ResourceFilterBoxView.swift
...eManager/Class/Page/Home/View/ResourceFilterBoxView.swift
+18
-7
YearMonthPickerView.swift
PhoneManager/Class/Page/Home/View/YearMonthPickerView.swift
+204
-70
HomeInfoTableViewCell.swift
...ger/Class/Page/Home/View/cell/HomeInfoTableViewCell.swift
+2
-0
PMShowImgVideoController.swift
...eManager/Class/Page/Secret/PMShowImgVideoController.swift
+7
-9
No files found.
PhoneManager/Class/Page/Home/Controller/PhotoRemoveViewController.swift
View file @
36283345
...
@@ -316,17 +316,19 @@ class PhotoRemoveViewController: BaseViewController {
...
@@ -316,17 +316,19 @@ class PhotoRemoveViewController: BaseViewController {
func
showTrashView
(){
func
showTrashView
(){
DispatchQueue
.
main
.
async
{
DispatchQueue
.
main
.
async
{
self
.
trashSubView
.
isHidden
=
false
self
.
trashSubView
.
isHidden
=
false
UIView
.
animate
(
withDuration
:
0.
1
)
{
UIView
.
animate
(
withDuration
:
0.
2
)
{
// 更新约束
// 更新约束
self
.
bottomConstraint
?
.
update
(
offset
:
0
)
self
.
bottomConstraint
?
.
update
(
offset
:
0
)
self
.
view
.
layoutIfNeeded
()
}
}
}
}
}
}
func
hideTrashView
(){
func
hideTrashView
(){
DispatchQueue
.
main
.
async
{
DispatchQueue
.
main
.
async
{
UIView
.
animate
(
withDuration
:
0.
1
)
{
UIView
.
animate
(
withDuration
:
0.
2
)
{
// 更新约束
// 更新约束
self
.
bottomConstraint
?
.
update
(
offset
:
78
+
safeHeight
)
self
.
bottomConstraint
?
.
update
(
offset
:
78
+
safeHeight
)
self
.
view
.
layoutIfNeeded
()
}
completion
:
{
finished
in
}
completion
:
{
finished
in
self
.
trashSubView
.
isHidden
=
true
self
.
trashSubView
.
isHidden
=
true
}
}
...
@@ -431,9 +433,13 @@ class PhotoRemoveViewController: BaseViewController {
...
@@ -431,9 +433,13 @@ class PhotoRemoveViewController: BaseViewController {
func
saveDataToKeepListDB
(){
func
saveDataToKeepListDB
(){
if
let
type
=
self
.
mediaType
{
if
let
type
=
self
.
mediaType
{
if
let
dataSg
=
Singleton
.
shared
.
keepList
[
type
]{
if
let
dataSg
=
Singleton
.
shared
.
keepList
[
type
]{
var
uinqueId
=
UUID
()
.
uuidString
for
item
in
dataSg
{
for
item
in
dataSg
{
// 如果是视频的话不会进行分组,所以每次传入不同的id组
if
type
==
.
video
{
let
uinqueId
=
UUID
()
.
uuidString
// 如果是视频的话不会进行分组,所以每次传入不同的id
// 重新生成一个
uinqueId
=
UUID
()
.
uuidString
}
let
success
=
GroupDatabase
.
shared
.
insert
(
localIdentifier
:
item
.
localIdentifier
,
assetSize
:
item
.
assetSize
,
createDate
:
item
.
createDate
,
mediaType
:
type
==
TrashTypeEnum
.
video
?
2
:
1
,
groupId
:
uinqueId
)
let
success
=
GroupDatabase
.
shared
.
insert
(
localIdentifier
:
item
.
localIdentifier
,
assetSize
:
item
.
assetSize
,
createDate
:
item
.
createDate
,
mediaType
:
type
==
TrashTypeEnum
.
video
?
2
:
1
,
groupId
:
uinqueId
)
if
success
==
false
{
if
success
==
false
{
Print
(
"保留单利数据到数据库保留列表失败"
)
Print
(
"保留单利数据到数据库保留列表失败"
)
...
...
PhoneManager/Class/Page/Home/View/DateSelectButtonView.swift
View file @
36283345
...
@@ -11,7 +11,7 @@ class DateSelectButtonView : UIView {
...
@@ -11,7 +11,7 @@ class DateSelectButtonView : UIView {
var
closeCallBack
:
()
->
Void
=
{}
var
closeCallBack
:
()
->
Void
=
{}
var
type
:
PikerDateType
?
var
type
:
Pi
c
kerDateType
?
lazy
var
dateButton
:
UIButton
=
{
lazy
var
dateButton
:
UIButton
=
{
let
button
=
UIButton
(
type
:
.
custom
)
let
button
=
UIButton
(
type
:
.
custom
)
...
...
PhoneManager/Class/Page/Home/View/PhotosRemoveBaseView.swift
View file @
36283345
...
@@ -21,15 +21,19 @@ class PhotosRemoveBaseView: UIView {
...
@@ -21,15 +21,19 @@ class PhotosRemoveBaseView: UIView {
func
reload
(
index
:
Int
)
->
Void
{
func
reload
(
index
:
Int
)
->
Void
{
if
let
url
=
url
{
if
let
url
=
url
{
self
.
innerVideoController
=
VideoViewController
()
if
self
.
innerVideoController
==
nil
{
if
let
vc
=
self
.
innerVideoController
{
self
.
innerVideoController
=
VideoViewController
()
vc
.
isAutoPlay
=
index
==
0
if
let
vc
=
self
.
innerVideoController
{
vc
.
url
=
url
vc
.
isAutoPlay
=
index
==
0
self
.
imageView
.
removeFromSuperview
()
vc
.
url
=
url
self
.
addSubview
(
vc
.
view
)
self
.
imageView
.
removeFromSuperview
()
vc
.
view
.
snp
.
makeConstraints
{
make
in
self
.
addSubview
(
vc
.
view
)
make
.
left
.
top
.
bottom
.
right
.
equalToSuperview
()
vc
.
view
.
snp
.
makeConstraints
{
make
in
make
.
left
.
top
.
bottom
.
right
.
equalToSuperview
()
}
}
}
}
else
{
self
.
innerVideoController
?
.
playerViewController
.
player
?
.
play
()
}
}
}
}
}
}
...
@@ -72,7 +76,11 @@ class PhotosRemoveBaseView: UIView {
...
@@ -72,7 +76,11 @@ class PhotosRemoveBaseView: UIView {
addSubview
(
imageView
)
addSubview
(
imageView
)
leftButton
.
frame
=
CGRect
(
x
:
0
,
y
:
0
,
width
:
95
,
height
:
42
)
leftButton
.
frame
=
CGRect
(
x
:
0
,
y
:
0
,
width
:
95
,
height
:
42
)
leftButton
.
center
=
imageView
.
center
if
self
.
url
!=
nil
{
self
.
leftButton
.
center
=
self
.
innerVideoController
?
.
view
.
center
??
imageView
.
center
}
else
{
self
.
leftButton
.
center
=
imageView
.
center
}
leftButton
.
setTitle
(
"Delete"
,
for
:
.
normal
)
leftButton
.
setTitle
(
"Delete"
,
for
:
.
normal
)
leftButton
.
backgroundColor
=
UIColor
(
red
:
0.95
,
green
:
0.21
,
blue
:
0.21
,
alpha
:
1
)
leftButton
.
backgroundColor
=
UIColor
(
red
:
0.95
,
green
:
0.21
,
blue
:
0.21
,
alpha
:
1
)
leftButton
.
tintColor
=
.
white
leftButton
.
tintColor
=
.
white
...
@@ -83,7 +91,11 @@ class PhotosRemoveBaseView: UIView {
...
@@ -83,7 +91,11 @@ class PhotosRemoveBaseView: UIView {
rightButton
.
frame
=
CGRect
(
x
:
0
,
y
:
0
,
width
:
95
,
height
:
42
)
rightButton
.
frame
=
CGRect
(
x
:
0
,
y
:
0
,
width
:
95
,
height
:
42
)
rightButton
.
center
=
imageView
.
center
if
self
.
url
!=
nil
{
self
.
rightButton
.
center
=
self
.
innerVideoController
?
.
view
.
center
??
imageView
.
center
}
else
{
self
.
rightButton
.
center
=
imageView
.
center
}
rightButton
.
setTitle
(
"Retain"
,
for
:
.
normal
)
rightButton
.
setTitle
(
"Retain"
,
for
:
.
normal
)
rightButton
.
backgroundColor
=
UIColor
(
red
:
0.18
,
green
:
0.76
,
blue
:
0.35
,
alpha
:
1
)
rightButton
.
backgroundColor
=
UIColor
(
red
:
0.18
,
green
:
0.76
,
blue
:
0.35
,
alpha
:
1
)
rightButton
.
tintColor
=
.
white
rightButton
.
tintColor
=
.
white
...
@@ -101,17 +113,24 @@ class PhotosRemoveBaseView: UIView {
...
@@ -101,17 +113,24 @@ class PhotosRemoveBaseView: UIView {
}
}
func
showLeftButton
()
{
func
showLeftButton
()
{
self
.
leftButton
.
center
=
imageView
.
center
if
self
.
url
!=
nil
{
UIView
.
animate
(
withDuration
:
0.2
)
{
self
.
leftButton
.
center
=
self
.
innerVideoController
?
.
view
.
center
??
imageView
.
center
self
.
leftButton
.
alpha
=
1
}
else
{
self
.
maskTempleteView
.
backgroundColor
=
UIColor
(
red
:
0.95
,
green
:
0.21
,
blue
:
0.21
,
alpha
:
0.4000
)
self
.
leftButton
.
center
=
imageView
.
center
self
.
addSubview
(
self
.
maskTempleteView
)
self
.
rightButton
.
alpha
=
0
}
}
self
.
leftButton
.
alpha
=
1
self
.
rightButton
.
alpha
=
0
self
.
maskTempleteView
.
backgroundColor
=
UIColor
(
red
:
0.95
,
green
:
0.21
,
blue
:
0.21
,
alpha
:
0.4000
)
self
.
addSubview
(
self
.
maskTempleteView
)
}
}
func
showRightButton
()
{
func
showRightButton
()
{
self
.
rightButton
.
center
=
imageView
.
center
if
self
.
url
!=
nil
{
self
.
rightButton
.
center
=
self
.
innerVideoController
?
.
view
.
center
??
imageView
.
center
}
else
{
self
.
rightButton
.
center
=
imageView
.
center
}
UIView
.
animate
(
withDuration
:
0.2
)
{
UIView
.
animate
(
withDuration
:
0.2
)
{
self
.
rightButton
.
alpha
=
1
self
.
rightButton
.
alpha
=
1
self
.
maskTempleteView
.
backgroundColor
=
UIColor
(
red
:
0.26
,
green
:
0.78
,
blue
:
0.41
,
alpha
:
0.4000
)
self
.
maskTempleteView
.
backgroundColor
=
UIColor
(
red
:
0.26
,
green
:
0.78
,
blue
:
0.41
,
alpha
:
0.4000
)
...
@@ -121,12 +140,18 @@ class PhotosRemoveBaseView: UIView {
...
@@ -121,12 +140,18 @@ class PhotosRemoveBaseView: UIView {
}
}
func
hideButtons
()
{
func
hideButtons
()
{
UIView
.
animate
(
withDuration
:
0.2
)
{
[
self
]
in
UIView
.
animate
(
withDuration
:
0.2
)
{
[
self
]
in
self
.
leftButton
.
alpha
=
0
self
.
leftButton
.
alpha
=
0
self
.
rightButton
.
alpha
=
0
self
.
rightButton
.
alpha
=
0
self
.
maskTempleteView
.
removeFromSuperview
()
self
.
maskTempleteView
.
removeFromSuperview
()
self
.
leftButton
.
center
=
self
.
imageView
.
center
if
self
.
url
!=
nil
{
self
.
rightButton
.
center
=
self
.
imageView
.
center
self
.
rightButton
.
center
=
self
.
innerVideoController
?
.
view
.
center
??
imageView
.
center
self
.
leftButton
.
center
=
self
.
innerVideoController
?
.
view
.
center
??
imageView
.
center
}
else
{
self
.
leftButton
.
center
=
self
.
imageView
.
center
self
.
rightButton
.
center
=
self
.
imageView
.
center
}
}
}
}
}
...
...
PhoneManager/Class/Page/Home/View/ResourceFilterBoxView.swift
View file @
36283345
...
@@ -127,8 +127,8 @@ class ResourceFilterBoxView : UIView {
...
@@ -127,8 +127,8 @@ class ResourceFilterBoxView : UIView {
private
func
setDefaultDataInPage
(){
private
func
setDefaultDataInPage
(){
// 设置按钮
// 设置按钮
resetByType
(
date
:
self
.
startDate
,
type
:
PikerDateType
.
start
)
resetByType
(
date
:
self
.
startDate
,
type
:
Pi
c
kerDateType
.
start
)
resetByType
(
date
:
self
.
endDate
,
type
:
PikerDateType
.
end
)
resetByType
(
date
:
self
.
endDate
,
type
:
Pi
c
kerDateType
.
end
)
// 设置选择框
// 设置选择框
DispatchQueue
.
main
.
async
{
DispatchQueue
.
main
.
async
{
...
@@ -141,7 +141,7 @@ class ResourceFilterBoxView : UIView {
...
@@ -141,7 +141,7 @@ class ResourceFilterBoxView : UIView {
/// - Parameters:
/// - Parameters:
/// - date: 时间
/// - date: 时间
/// - type: 类型
/// - type: 类型
private
func
resetByType
(
date
:
Date
?,
type
:
PikerDateType
){
private
func
resetByType
(
date
:
Date
?,
type
:
Pi
c
kerDateType
){
if
let
date
=
date
{
if
let
date
=
date
{
let
timeNumber
=
getYearAndMonthFromDate
(
currentDate
:
date
)
let
timeNumber
=
getYearAndMonthFromDate
(
currentDate
:
date
)
if
let
year
=
timeNumber
.
0
{
if
let
year
=
timeNumber
.
0
{
...
@@ -167,13 +167,14 @@ class ResourceFilterBoxView : UIView {
...
@@ -167,13 +167,14 @@ class ResourceFilterBoxView : UIView {
/// - year: 年
/// - year: 年
/// - month: 月
/// - month: 月
/// - type: 按钮类型
/// - type: 按钮类型
func
resetDateStringFromYearAndMonth
(
year
:
Int
,
month
:
Int
,
type
:
PikerDateType
){
func
resetDateStringFromYearAndMonth
(
year
:
Int
,
month
:
Int
,
type
:
Pi
c
kerDateType
){
DispatchQueue
.
main
.
async
{
DispatchQueue
.
main
.
async
{
if
type
==
.
start
{
if
type
==
.
start
{
self
.
startDateButton
.
dateButton
.
setTitle
(
"From
\(
self
.
getMonthEn
(
month
:
month
)
)
\(
year
)
"
,
for
:
.
normal
)
self
.
startDateButton
.
dateButton
.
setTitle
(
"From
\(
self
.
getMonthEn
(
month
:
month
)
)
\(
year
)
"
,
for
:
.
normal
)
self
.
startDateButton
.
closeButton
.
isHidden
=
false
self
.
startDateButton
.
closeButton
.
isHidden
=
false
self
.
startDate
=
self
.
dateFrom
(
year
:
year
,
month
:
month
)
self
.
startDate
=
self
.
dateFrom
(
year
:
year
,
month
:
month
)
}
else
{
}
else
{
// 判断结束时间是否大于开始时间,如果是
self
.
endDateButton
.
dateButton
.
setTitle
(
"To
\(
self
.
getMonthEn
(
month
:
month
)
)
\(
year
)
"
,
for
:
.
normal
)
self
.
endDateButton
.
dateButton
.
setTitle
(
"To
\(
self
.
getMonthEn
(
month
:
month
)
)
\(
year
)
"
,
for
:
.
normal
)
self
.
endDateButton
.
closeButton
.
isHidden
=
false
self
.
endDateButton
.
closeButton
.
isHidden
=
false
self
.
endDate
=
self
.
lastDayOfMonth
(
year
:
year
,
month
:
month
)
self
.
endDate
=
self
.
lastDayOfMonth
(
year
:
year
,
month
:
month
)
...
@@ -214,9 +215,13 @@ class ResourceFilterBoxView : UIView {
...
@@ -214,9 +215,13 @@ class ResourceFilterBoxView : UIView {
self
.
startDateButton
.
closeCallBack
=
{
self
.
startDateButton
.
closeCallBack
=
{
self
.
startDate
=
nil
self
.
startDate
=
nil
self
.
datePicker
?
.
startDate
=
nil
self
.
datePicker
?
.
reloadData
()
}
}
self
.
endDateButton
.
closeCallBack
=
{
self
.
endDateButton
.
closeCallBack
=
{
self
.
endDate
=
nil
self
.
endDate
=
nil
self
.
datePicker
?
.
endDate
=
nil
self
.
datePicker
?
.
reloadData
()
}
}
self
.
startDateButton
.
reSetButtonTitle
()
self
.
startDateButton
.
reSetButtonTitle
()
...
@@ -348,18 +353,24 @@ class ResourceFilterBoxView : UIView {
...
@@ -348,18 +353,24 @@ class ResourceFilterBoxView : UIView {
popDatePikerView
(
type
:
.
end
)
popDatePikerView
(
type
:
.
end
)
}
}
func
popDatePikerView
(
type
:
PikerDateType
){
func
popDatePikerView
(
type
:
Pi
c
kerDateType
){
showDatePicker
(
type
:
type
)
showDatePicker
(
type
:
type
,
startDate
:
self
.
startDate
,
endDate
:
self
.
endDate
)
}
}
// 显示
// 显示
func
showDatePicker
(
type
:
Pi
kerDateType
){
func
showDatePicker
(
type
:
Pi
ckerDateType
,
startDate
:
Date
?,
endDate
:
Date
?
){
if
self
.
datePicker
!=
nil
{
if
self
.
datePicker
!=
nil
{
self
.
datePicker
?
.
type
=
type
self
.
datePicker
?
.
type
=
type
self
.
datePicker
?
.
startDate
=
self
.
startDate
self
.
datePicker
?
.
endDate
=
self
.
endDate
self
.
datePicker
?
.
reloadData
()
return
return
}
}
self
.
datePicker
=
YearMonthPickerView
()
self
.
datePicker
=
YearMonthPickerView
()
self
.
datePicker
?
.
type
=
type
self
.
datePicker
?
.
type
=
type
self
.
datePicker
?
.
startDate
=
self
.
startDate
self
.
datePicker
?
.
endDate
=
self
.
endDate
self
.
datePicker
?
.
backgroundColor
=
.
white
self
.
datePicker
?
.
backgroundColor
=
.
white
if
let
window
=
cWindow
,
let
datePicker
=
self
.
datePicker
{
if
let
window
=
cWindow
,
let
datePicker
=
self
.
datePicker
{
let
datePickerFrame
=
CGRect
(
x
:
0
,
y
:
window
.
height
,
width
:
window
.
width
,
height
:
204
)
let
datePickerFrame
=
CGRect
(
x
:
0
,
y
:
window
.
height
,
width
:
window
.
width
,
height
:
204
)
...
...
PhoneManager/Class/Page/Home/View/YearMonthPickerView.swift
View file @
36283345
...
@@ -5,26 +5,38 @@
...
@@ -5,26 +5,38 @@
// Created by edy on 2025/5/12.
// Created by edy on 2025/5/12.
//
//
import
Foundation
import
UIKit
enum
PikerDateType
{
enum
Pi
c
kerDateType
{
case
start
case
start
case
end
case
end
}
}
class
YearMonthPickerView
:
UIView
{
class
YearMonthPickerView
:
UIView
{
var
type
:
PickerDateType
=
.
start
{
var
type
:
PikerDateType
=
.
start
didSet
{
reloadData
()
}
}
// MARK: - Properties
// MARK: - Properties
private
var
selectedYear
:
Int
=
0
private
var
selectedYear
:
Int
=
0
private
var
selectedMonth
:
Int
=
0
private
var
selectedMonth
:
Int
=
0
private
let
calendar
=
Calendar
.
current
private
var
currentYear
:
Int
private
var
currentMonth
:
Int
var
startDate
:
Date
?
{
didSet
{
reloadData
()
}
}
var
endDate
:
Date
?
{
didSet
{
reloadData
()
}
}
var
onCancel
:
(()
->
Void
)?
var
onCancel
:
(()
->
Void
)?
var
onConfirm
:
((
_
type
:
PikerDateType
,
_
year
:
Int
,
_
month
:
Int
)
->
Void
)?
var
onConfirm
:
((
_
type
:
PickerDateType
,
_
year
:
Int
,
_
month
:
Int
)
->
Void
)?
private
let
pickerView
:
UIPickerView
=
{
private
let
pickerView
:
UIPickerView
=
{
let
picker
=
UIPickerView
()
let
picker
=
UIPickerView
()
...
@@ -32,106 +44,136 @@ class YearMonthPickerView: UIView {
...
@@ -32,106 +44,136 @@ class YearMonthPickerView: UIView {
return
picker
return
picker
}()
}()
private
let
years
=
Array
(
Array
(
1970
...
Calendar
.
current
.
component
(
.
year
,
from
:
Date
()))
.
reversed
())
private
lazy
var
years
:
[
Int
]
=
{
Array
(
1970
...
currentYear
)
.
reversed
()
}()
private
lazy
var
months
:
[
String
]
=
{
private
lazy
var
months
:
[
String
]
=
{
let
formatter
=
DateFormatter
()
DateFormatter
()
.
monthSymbols
??
[]
formatter
.
locale
=
Locale
(
identifier
:
"en_US"
)
return
formatter
.
monthSymbols
}()
}()
// MARK: - Initialization
// MARK: - Initialization
override
init
(
frame
:
CGRect
)
{
override
init
(
frame
:
CGRect
)
{
currentYear
=
calendar
.
component
(
.
year
,
from
:
Date
())
currentMonth
=
calendar
.
component
(
.
month
,
from
:
Date
())
super
.
init
(
frame
:
frame
)
super
.
init
(
frame
:
frame
)
setupView
()
setupView
()
}
}
required
init
?(
coder
:
NSCoder
)
{
required
init
?(
coder
:
NSCoder
)
{
currentYear
=
calendar
.
component
(
.
year
,
from
:
Date
())
currentMonth
=
calendar
.
component
(
.
month
,
from
:
Date
())
super
.
init
(
coder
:
coder
)
super
.
init
(
coder
:
coder
)
setupView
()
setupView
()
}
}
// MARK: - Public Methods
func
reloadData
()
{
configureInitialSelection
()
pickerView
.
reloadAllComponents
()
}
// MARK: - Setup
// MARK: - Setup
private
func
setupView
()
{
private
func
setupView
()
{
backgroundColor
=
.
white
backgroundColor
=
.
white
layer
.
cornerRadius
=
12
layer
.
cornerRadius
=
12
layer
.
masksToBounds
=
true
layer
.
masksToBounds
=
true
// 按钮容器
let
buttonContainer
=
createButtonContainer
()
let
buttonContainer
=
UIView
()
let
stackView
=
UIStackView
(
arrangedSubviews
:
[
buttonContainer
,
pickerView
])
buttonContainer
.
backgroundColor
=
UIColor
(
red
:
0.9
,
green
:
0.9
,
blue
:
0.9
,
alpha
:
1
)
stackView
.
axis
=
.
vertical
buttonContainer
.
translatesAutoresizingMaskIntoConstraints
=
false
stackView
.
spacing
=
0
stackView
.
translatesAutoresizingMaskIntoConstraints
=
false
addSubview
(
stackView
)
NSLayoutConstraint
.
activate
([
stackView
.
topAnchor
.
constraint
(
equalTo
:
topAnchor
),
stackView
.
leadingAnchor
.
constraint
(
equalTo
:
leadingAnchor
),
stackView
.
trailingAnchor
.
constraint
(
equalTo
:
trailingAnchor
),
stackView
.
bottomAnchor
.
constraint
(
equalTo
:
bottomAnchor
)
])
pickerView
.
delegate
=
self
pickerView
.
dataSource
=
self
configureInitialSelection
()
}
private
func
createButtonContainer
()
->
UIView
{
let
container
=
UIView
()
container
.
backgroundColor
=
UIColor
(
red
:
0.9
,
green
:
0.9
,
blue
:
0.9
,
alpha
:
1
)
container
.
translatesAutoresizingMaskIntoConstraints
=
false
container
.
heightAnchor
.
constraint
(
equalToConstant
:
42
)
.
isActive
=
true
// 取消按钮
let
cancelButton
=
UIButton
(
type
:
.
system
)
let
cancelButton
=
UIButton
(
type
:
.
system
)
cancelButton
.
setTitle
(
"Cancel"
,
for
:
.
normal
)
cancelButton
.
setTitle
(
"Cancel"
,
for
:
.
normal
)
cancelButton
.
contentHorizontalAlignment
=
.
left
cancelButton
.
contentHorizontalAlignment
=
.
left
cancelButton
.
addTarget
(
self
,
action
:
#selector(
cancelAction
)
,
for
:
.
touchUpInside
)
cancelButton
.
translatesAutoresizingMaskIntoConstraints
=
false
cancelButton
.
translatesAutoresizingMaskIntoConstraints
=
false
cancelButton
.
addTarget
(
self
,
action
:
#selector(
cancelAction
)
,
for
:
.
touchUpInside
)
cancelButton
.
setTitleColor
(
UIColor
(
red
:
0.6
,
green
:
0.6
,
blue
:
0.6
,
alpha
:
1
),
for
:
.
normal
)
cancelButton
.
setTitleColor
(
UIColor
(
red
:
0.6
,
green
:
0.6
,
blue
:
0.6
,
alpha
:
1
),
for
:
.
normal
)
cancelButton
.
titleLabel
?
.
font
=
UIFont
.
systemFont
(
ofSize
:
14
,
weight
:
.
medium
)
cancelButton
.
titleLabel
?
.
font
=
.
systemFont
(
ofSize
:
14
,
weight
:
.
medium
)
// 确认按钮
let
confirmButton
=
UIButton
(
type
:
.
system
)
let
confirmButton
=
UIButton
(
type
:
.
system
)
confirmButton
.
setTitle
(
"Completed"
,
for
:
.
normal
)
confirmButton
.
setTitle
(
"Completed"
,
for
:
.
normal
)
confirmButton
.
contentHorizontalAlignment
=
.
right
confirmButton
.
contentHorizontalAlignment
=
.
right
confirmButton
.
addTarget
(
self
,
action
:
#selector(
confirmAction
)
,
for
:
.
touchUpInside
)
confirmButton
.
translatesAutoresizingMaskIntoConstraints
=
false
confirmButton
.
translatesAutoresizingMaskIntoConstraints
=
false
cancelButton
.
setTitleColor
(
UIColor
(
red
:
0.07
,
green
:
0.07
,
blue
:
0.07
,
alpha
:
1
),
for
:
.
normal
)
confirmButton
.
addTarget
(
self
,
action
:
#selector(
confirmAction
)
,
for
:
.
touchUpInside
)
cancelButton
.
titleLabel
?
.
font
=
UIFont
.
systemFont
(
ofSize
:
14
,
weight
:
.
medium
)
confirmButton
.
setTitleColor
(
UIColor
(
red
:
0.07
,
green
:
0.07
,
blue
:
0.07
,
alpha
:
1
),
for
:
.
normal
)
confirmButton
.
titleLabel
?
.
font
=
.
systemFont
(
ofSize
:
14
,
weight
:
.
medium
)
buttonContainer
.
addSubview
(
cancelButton
)
[
cancelButton
,
confirmButton
]
.
forEach
{
buttonContainer
.
addSubview
(
confirmButton
)
$0
.
translatesAutoresizingMaskIntoConstraints
=
false
container
.
addSubview
(
$0
)
}
// 按钮容器约束
NSLayoutConstraint
.
activate
([
NSLayoutConstraint
.
activate
([
buttonContainer
.
heightAnchor
.
constraint
(
equalToConstant
:
42
),
cancelButton
.
leadingAnchor
.
constraint
(
equalTo
:
container
.
leadingAnchor
,
constant
:
16
),
cancelButton
.
centerYAnchor
.
constraint
(
equalTo
:
container
.
centerYAnchor
),
cancelButton
.
leadingAnchor
.
constraint
(
equalTo
:
buttonContainer
.
leadingAnchor
,
constant
:
16
),
cancelButton
.
centerYAnchor
.
constraint
(
equalTo
:
buttonContainer
.
centerYAnchor
),
confirmButton
.
trailingAnchor
.
constraint
(
equalTo
:
buttonC
ontainer
.
trailingAnchor
,
constant
:
-
16
),
confirmButton
.
trailingAnchor
.
constraint
(
equalTo
:
c
ontainer
.
trailingAnchor
,
constant
:
-
16
),
confirmButton
.
centerYAnchor
.
constraint
(
equalTo
:
buttonC
ontainer
.
centerYAnchor
)
confirmButton
.
centerYAnchor
.
constraint
(
equalTo
:
c
ontainer
.
centerYAnchor
)
])
])
// 主布局
return
container
let
stackView
=
UIStackView
(
arrangedSubviews
:
[
buttonContainer
,
pickerView
])
}
stackView
.
axis
=
.
vertical
stackView
.
spacing
=
0
private
func
configureInitialSelection
()
{
stackView
.
translatesAutoresizingMaskIntoConstraints
=
false
let
targetDate
:
Date
?
switch
type
{
case
.
start
:
targetDate
=
startDate
case
.
end
:
targetDate
=
endDate
}
addSubview
(
stackView
)
let
date
=
targetDate
??
Date
()
var
year
=
calendar
.
component
(
.
year
,
from
:
date
)
var
month
=
calendar
.
component
(
.
month
,
from
:
date
)
NSLayoutConstraint
.
activate
([
// 应用约束条件
stackView
.
topAnchor
.
constraint
(
equalTo
:
topAnchor
),
(
year
,
month
)
=
applyConstraints
(
to
:
year
,
month
:
month
)
stackView
.
leadingAnchor
.
constraint
(
equalTo
:
leadingAnchor
),
stackView
.
trailingAnchor
.
constraint
(
equalTo
:
trailingAnchor
),
stackView
.
bottomAnchor
.
constraint
(
equalTo
:
bottomAnchor
)
])
pickerView
.
delegate
=
self
// 自动滚动到有效位置
pickerView
.
dataSource
=
self
scrollToValidYear
(
year
,
month
:
month
)
}
// 设置初始选择
let
currentYear
=
Calendar
.
current
.
component
(
.
year
,
from
:
Date
())
private
func
scrollToValidYear
(
_
year
:
Int
,
month
:
Int
)
{
let
currentMonth
=
Calendar
.
current
.
component
(
.
month
,
from
:
Date
())
guard
let
yearIndex
=
years
.
firstIndex
(
of
:
year
)
else
{
return
}
selectedYear
=
currentY
ear
selectedYear
=
y
ear
selectedMonth
=
currentM
onth
-
1
selectedMonth
=
m
onth
-
1
if
let
yearIndex
=
years
.
firstIndex
(
of
:
currentYear
)
{
pickerView
.
selectRow
(
yearIndex
,
inComponent
:
1
,
animated
:
false
)
pickerView
.
selectRow
(
yearIndex
,
inComponent
:
1
,
animated
:
false
)
pickerView
.
selectRow
(
selectedMonth
,
inComponent
:
0
,
animated
:
false
)
}
pickerView
.
tintColor
=
.
red
pickerView
.
selectRow
(
currentMonth
-
1
,
inComponent
:
0
,
animated
:
false
)
}
}
// MARK: -
按钮操作
// MARK: -
Button Actions
@objc
private
func
cancelAction
()
{
@objc
private
func
cancelAction
()
{
onCancel
?()
onCancel
?()
}
}
@objc
private
func
confirmAction
()
{
@objc
private
func
confirmAction
()
{
onConfirm
?(
self
.
type
,
selectedYear
,
selectedMonth
+
1
)
// 最终校验
let
(
validYear
,
validMonth
)
=
applyConstraints
(
to
:
selectedYear
,
month
:
selectedMonth
+
1
)
scrollToValidYear
(
validYear
,
month
:
validMonth
)
onConfirm
?(
type
,
validYear
,
validMonth
)
}
}
}
}
...
@@ -142,32 +184,124 @@ extension YearMonthPickerView: UIPickerViewDataSource, UIPickerViewDelegate {
...
@@ -142,32 +184,124 @@ extension YearMonthPickerView: UIPickerViewDataSource, UIPickerViewDelegate {
}
}
func
pickerView
(
_
pickerView
:
UIPickerView
,
numberOfRowsInComponent
component
:
Int
)
->
Int
{
func
pickerView
(
_
pickerView
:
UIPickerView
,
numberOfRowsInComponent
component
:
Int
)
->
Int
{
return
component
==
0
?
months
.
count
:
years
.
count
component
==
0
?
12
:
years
.
count
}
}
func
pickerView
(
_
pickerView
:
UIPickerView
,
titleForRow
row
:
Int
,
forComponent
component
:
Int
)
->
String
?
{
func
pickerView
(
_
pickerView
:
UIPickerView
,
viewForRow
row
:
Int
,
forComponent
component
:
Int
,
reusing
view
:
UIView
?)
->
UIView
{
return
component
==
0
?
months
[
row
]
:
"
\(
years
[
row
]
)
"
let
label
=
UILabel
()
label
.
textAlignment
=
.
center
let
year
=
component
==
1
?
years
[
row
]
:
selectedYear
let
month
=
component
==
0
?
(
row
+
1
)
:
(
selectedMonth
+
1
)
if
component
==
0
{
label
.
text
=
months
[
row
]
}
else
{
label
.
text
=
"
\(
years
[
row
]
)
"
}
label
.
textColor
=
isDateValid
(
year
:
year
,
month
:
month
)
?
.
black
:
.
lightGray
return
label
}
}
func
pickerView
(
_
pickerView
:
UIPickerView
,
didSelectRow
row
:
Int
,
inComponent
component
:
Int
)
{
func
pickerView
(
_
pickerView
:
UIPickerView
,
didSelectRow
row
:
Int
,
inComponent
component
:
Int
)
{
if
component
==
0
{
if
component
==
1
{
selectedMonth
=
row
}
else
{
selectedYear
=
years
[
row
]
selectedYear
=
years
[
row
]
adjustMonthSelection
()
}
else
{
selectedMonth
=
row
}
// 自动修正无效选择
if
!
isDateValid
(
year
:
selectedYear
,
month
:
selectedMonth
+
1
)
{
let
(
validYear
,
validMonth
)
=
applyConstraints
(
to
:
selectedYear
,
month
:
selectedMonth
+
1
)
scrollToValidYear
(
validYear
,
month
:
validMonth
)
}
}
}
}
func
pickerView
(
_
pickerView
:
UIPickerView
,
widthForComponent
component
:
Int
)
->
CGFloat
{
func
pickerView
(
_
pickerView
:
UIPickerView
,
widthForComponent
component
:
Int
)
->
CGFloat
{
return
component
==
0
?
self
.
width
/
2
:
self
.
width
/
2
bounds
.
width
/
2
}
}
// MARK: - Date Validation
extension
YearMonthPickerView
{
private
func
isDateValid
(
year
:
Int
,
month
:
Int
)
->
Bool
{
// 检查当前时间限制
if
year
>
currentYear
||
(
year
==
currentYear
&&
month
>
currentMonth
)
{
return
false
}
// 检查开始/结束时间约束
switch
type
{
case
.
start
:
if
let
endDate
=
endDate
{
let
endYear
=
calendar
.
component
(
.
year
,
from
:
endDate
)
let
endMonth
=
calendar
.
component
(
.
month
,
from
:
endDate
)
return
(
year
<
endYear
)
||
(
year
==
endYear
&&
month
<=
endMonth
)
}
case
.
end
:
if
let
startDate
=
startDate
{
let
startYear
=
calendar
.
component
(
.
year
,
from
:
startDate
)
let
startMonth
=
calendar
.
component
(
.
month
,
from
:
startDate
)
return
(
year
>
startYear
)
||
(
year
==
startYear
&&
month
>=
startMonth
)
}
}
return
true
}
}
private
func
applyConstraints
(
to
year
:
Int
,
month
:
Int
)
->
(
year
:
Int
,
month
:
Int
)
{
private
var
currentYear
:
Int
{
var
validYear
=
year
return
Calendar
.
current
.
component
(
.
year
,
from
:
Date
())
var
validMonth
=
month
// 当前时间约束
validYear
=
min
(
validYear
,
currentYear
)
validMonth
=
min
(
validMonth
,
validYear
==
currentYear
?
currentMonth
:
12
)
// 开始/结束时间约束
switch
type
{
case
.
start
:
if
let
endDate
=
endDate
{
let
endYear
=
calendar
.
component
(
.
year
,
from
:
endDate
)
let
endMonth
=
calendar
.
component
(
.
month
,
from
:
endDate
)
validYear
=
min
(
validYear
,
endYear
)
validMonth
=
min
(
validMonth
,
validYear
==
endYear
?
endMonth
:
12
)
}
case
.
end
:
if
let
startDate
=
startDate
{
let
startYear
=
calendar
.
component
(
.
year
,
from
:
startDate
)
let
startMonth
=
calendar
.
component
(
.
month
,
from
:
startDate
)
validYear
=
max
(
validYear
,
startYear
)
validMonth
=
max
(
validMonth
,
validYear
==
startYear
?
startMonth
:
1
)
}
}
return
(
validYear
,
validMonth
)
}
}
private
var
currentMonth
:
Int
{
private
func
adjustMonthSelection
()
{
return
Calendar
.
current
.
component
(
.
month
,
from
:
Date
())
let
maxMonth
:
Int
if
selectedYear
==
currentYear
{
maxMonth
=
currentMonth
}
else
if
let
constraintMonth
=
getConstraintMonth
()
{
maxMonth
=
(
type
==
.
start
)
?
constraintMonth
:
12
}
else
{
maxMonth
=
12
}
if
(
selectedMonth
+
1
)
>
maxMonth
{
selectedMonth
=
maxMonth
-
1
pickerView
.
selectRow
(
selectedMonth
,
inComponent
:
0
,
animated
:
true
)
}
}
}
private
func
getConstraintMonth
()
->
Int
?
{
switch
type
{
case
.
start
:
return
endDate
.
flatMap
{
calendar
.
component
(
.
month
,
from
:
$0
)
}
case
.
end
:
return
startDate
.
flatMap
{
calendar
.
component
(
.
month
,
from
:
$0
)
}
}
}
}
}
PhoneManager/Class/Page/Home/View/cell/HomeInfoTableViewCell.swift
View file @
36283345
...
@@ -268,6 +268,8 @@ extension HomeInfoTableViewCell:UICollectionViewDelegate,UICollectionViewDataSou
...
@@ -268,6 +268,8 @@ extension HomeInfoTableViewCell:UICollectionViewDelegate,UICollectionViewDataSou
let
vc
=
PMShowImgVideoController
()
let
vc
=
PMShowImgVideoController
()
if
model
?
.
type
==
.
SimilarVideos
||
model
?
.
type
==
.
videos
{
if
model
?
.
type
==
.
SimilarVideos
||
model
?
.
type
==
.
videos
{
vc
.
state
=
.
similarVideos
vc
.
state
=
.
similarVideos
}
else
if
model
?
.
type
==
.
duplicates
{
vc
.
state
=
.
duplicates
}
else
{
}
else
{
vc
.
state
=
.
similarPhotos
vc
.
state
=
.
similarPhotos
}
}
...
...
PhoneManager/Class/Page/Secret/PMShowImgVideoController.swift
View file @
36283345
...
@@ -16,6 +16,8 @@ class PMShowImgVideoController: BaseViewController {
...
@@ -16,6 +16,8 @@ class PMShowImgVideoController: BaseViewController {
case
similarPhotos
case
similarPhotos
// 相似视频
// 相似视频
case
similarVideos
case
similarVideos
// 重复项
case
duplicates
}
}
// 资源类型 0-图片 1-视频
// 资源类型 0-图片 1-视频
...
@@ -290,11 +292,9 @@ extension PMShowImgVideoController : UICollectionViewDelegate,UICollectionViewDa
...
@@ -290,11 +292,9 @@ extension PMShowImgVideoController : UICollectionViewDelegate,UICollectionViewDa
showName
.
loadPhotoOrVideo
{
durs
,
icon
in
showName
.
loadPhotoOrVideo
{
durs
,
icon
in
cell
.
icon
=
icon
cell
.
icon
=
icon
}
}
if
let
data
=
self
.
homeDataSource
{
cell
.
bestResultButton
.
isHidden
=
true
cell
.
bestResultButton
.
isHidden
=
indexPath
.
row
!=
0
||
data
.
count
<=
1
if
self
.
homeDataSource
==
nil
{
}
else
{
cell
.
selectBtn
.
isHidden
=
true
cell
.
selectBtn
.
isHidden
=
true
cell
.
bestResultButton
.
isHidden
=
true
}
}
cell
.
isCurrent
=
selectSet
.
contains
(
indexPath
.
row
)
cell
.
isCurrent
=
selectSet
.
contains
(
indexPath
.
row
)
cell
.
callblock
=
{[
weak
self
]
in
cell
.
callblock
=
{[
weak
self
]
in
...
@@ -334,9 +334,7 @@ extension PMShowImgVideoController : UICollectionViewDelegate,UICollectionViewDa
...
@@ -334,9 +334,7 @@ extension PMShowImgVideoController : UICollectionViewDelegate,UICollectionViewDa
}
}
}
else
{
}
else
{
let
cell
=
collectionView
.
dequeueReusableCell
(
withReuseIdentifier
:
PMShowItemCellID
,
for
:
indexPath
)
as!
PMShowItemCell
let
cell
=
collectionView
.
dequeueReusableCell
(
withReuseIdentifier
:
PMShowItemCellID
,
for
:
indexPath
)
as!
PMShowItemCell
if
let
data
=
self
.
homeDataSource
{
if
self
.
homeDataSource
==
nil
{
}
else
{
cell
.
selectBtn
.
isHidden
=
true
cell
.
selectBtn
.
isHidden
=
true
}
}
showName
.
loadPhotoOrVideo
{
duration
,
icon
in
showName
.
loadPhotoOrVideo
{
duration
,
icon
in
...
@@ -349,14 +347,14 @@ extension PMShowImgVideoController : UICollectionViewDelegate,UICollectionViewDa
...
@@ -349,14 +347,14 @@ extension PMShowImgVideoController : UICollectionViewDelegate,UICollectionViewDa
}
}
}
}
if
state
==
.
similarPhotos
{
if
state
==
.
similarPhotos
||
state
==
.
duplicates
{
if
collectionView
==
MaxCollection
{
if
collectionView
==
MaxCollection
{
let
cell
=
collectionView
.
dequeueReusableCell
(
withReuseIdentifier
:
PMShowImgCellID
,
for
:
indexPath
)
as!
PMShowImgCell
let
cell
=
collectionView
.
dequeueReusableCell
(
withReuseIdentifier
:
PMShowImgCellID
,
for
:
indexPath
)
as!
PMShowImgCell
cell
.
icon
=
self
.
homeDataSource
!
[
indexPath
.
row
]
.
image
??
UIImage
()
cell
.
icon
=
self
.
homeDataSource
!
[
indexPath
.
row
]
.
image
??
UIImage
()
cell
.
isCurrent
=
selectSet
.
contains
(
indexPath
.
row
)
cell
.
isCurrent
=
selectSet
.
contains
(
indexPath
.
row
)
if
let
data
=
self
.
homeDataSource
{
if
let
data
=
self
.
homeDataSource
{
cell
.
bestResultButton
.
isHidden
=
indexPath
.
row
!=
0
||
data
.
count
<=
1
cell
.
bestResultButton
.
isHidden
=
indexPath
.
row
!=
0
||
data
.
count
<=
1
||
state
==
.
duplicates
}
}
cell
.
callblock
=
{[
weak
self
]
in
cell
.
callblock
=
{[
weak
self
]
in
guard
let
self
=
self
else
{
return
}
guard
let
self
=
self
else
{
return
}
...
...
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