Commit 36283345 authored by CZ1004's avatar CZ1004

【优化】时间选择器

parent 545b78fb
...@@ -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("保留单利数据到数据库保留列表失败")
......
...@@ -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 : PickerDateType?
lazy var dateButton : UIButton = { lazy var dateButton : UIButton = {
let button = UIButton(type: .custom) let button = UIButton(type: .custom)
......
...@@ -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
}
} }
} }
......
...@@ -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: PickerDateType.start)
resetByType(date: self.endDate, type: PikerDateType.end) resetByType(date: self.endDate, type: PickerDateType.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:PickerDateType){
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: PickerDateType){
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: PickerDateType){
showDatePicker(type: type) showDatePicker(type: type,startDate: self.startDate,endDate: self.endDate)
} }
// 显示 // 显示
func showDatePicker(type: PikerDateType){ func showDatePicker(type: PickerDateType,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)
......
...@@ -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 PickerDateType {
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: buttonContainer.trailingAnchor, constant: -16), confirmButton.trailingAnchor.constraint(equalTo: container.trailingAnchor, constant: -16),
confirmButton.centerYAnchor.constraint(equalTo: buttonContainer.centerYAnchor) confirmButton.centerYAnchor.constraint(equalTo: container.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 = currentYear selectedYear = year
selectedMonth = currentMonth - 1 selectedMonth = month - 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) }
}
}
} }
...@@ -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
} }
......
...@@ -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 }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment