//// //// LoadingViewController.swift //// QuickSearchLocation //// //// Created by Destiny on 2024/12/31. //// // //import UIKit //import Photos // //class LoadingViewController: UIViewController { // private let photoClassifier = PhotoClassifier() // private let progressView = UIProgressView(progressViewStyle: .default) // private let statusLabel = UILabel() // private let resultLabel = UILabel() // private let collectionView: UICollectionView // private var similarGroups: [[PHAsset]] = [] // private var timer: Timer? // // // 添加详细进度标签 // private let detailProgressLabel = UILabel() // private let percentageLabel = UILabel() // // override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { // // 初始化 CollectionView // let layout = UICollectionViewFlowLayout() // layout.scrollDirection = .vertical // layout.minimumLineSpacing = 10 // layout.minimumInteritemSpacing = 5 // // let screenWidth = UIScreen.main.bounds.width // let width = (screenWidth - 20) / 3 // layout.itemSize = CGSize(width: width, height: width) // layout.sectionInset = UIEdgeInsets(top: 10, left: 5, bottom: 10, right: 5) // layout.headerReferenceSize = CGSize(width: screenWidth, height: 40) // // collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) // // super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) // } // // required init?(coder: NSCoder) { // fatalError("init(coder:) has not been implemented") // } // // override func viewDidLoad() { // super.viewDidLoad() // setupUI() // startClassifying() // } // // private func setupUI() { // view.backgroundColor = .white // // // 设置进度容器视图 // let progressContainer = UIView() // progressContainer.translatesAutoresizingMaskIntoConstraints = false // view.addSubview(progressContainer) // // // 配置所有标签 // statusLabel.textAlignment = .center // statusLabel.font = .systemFont(ofSize: 16, weight: .medium) // // detailProgressLabel.textAlignment = .center // detailProgressLabel.font = .systemFont(ofSize: 14) // detailProgressLabel.textColor = .darkGray // // percentageLabel.textAlignment = .center // percentageLabel.font = .systemFont(ofSize: 14, weight: .medium) // percentageLabel.textColor = .systemBlue // // resultLabel.textAlignment = .center // resultLabel.numberOfLines = 0 // resultLabel.font = .systemFont(ofSize: 14) // // // 配置进度条 // progressView.progressTintColor = .systemBlue // progressView.trackTintColor = .systemGray5 // // // 添加所有视图 // [statusLabel, progressView, detailProgressLabel, percentageLabel, resultLabel].forEach { // $0.translatesAutoresizingMaskIntoConstraints = false // progressContainer.addSubview($0) // } // // // 布局约束 // NSLayoutConstraint.activate([ // progressContainer.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), // progressContainer.leadingAnchor.constraint(equalTo: view.leadingAnchor), // progressContainer.trailingAnchor.constraint(equalTo: view.trailingAnchor), // progressContainer.heightAnchor.constraint(equalToConstant: 180), // // statusLabel.topAnchor.constraint(equalTo: progressContainer.topAnchor, constant: 20), // statusLabel.centerXAnchor.constraint(equalTo: progressContainer.centerXAnchor), // // progressView.topAnchor.constraint(equalTo: statusLabel.bottomAnchor, constant: 15), // progressView.centerXAnchor.constraint(equalTo: progressContainer.centerXAnchor), // progressView.widthAnchor.constraint(equalTo: progressContainer.widthAnchor, multiplier: 0.8), // // detailProgressLabel.topAnchor.constraint(equalTo: progressView.bottomAnchor, constant: 10), // detailProgressLabel.centerXAnchor.constraint(equalTo: progressContainer.centerXAnchor), // // percentageLabel.topAnchor.constraint(equalTo: detailProgressLabel.bottomAnchor, constant: 5), // percentageLabel.centerXAnchor.constraint(equalTo: progressContainer.centerXAnchor), // // resultLabel.topAnchor.constraint(equalTo: percentageLabel.bottomAnchor, constant: 15), // resultLabel.centerXAnchor.constraint(equalTo: progressContainer.centerXAnchor), // resultLabel.widthAnchor.constraint(equalTo: progressContainer.widthAnchor, multiplier: 0.8) // ]) // // // 设置 CollectionView // collectionView.backgroundColor = .white // collectionView.delegate = self // collectionView.dataSource = self // collectionView.register(PhotoCell.self, forCellWithReuseIdentifier: "PhotoCell") // collectionView.register( // HeaderView.self, // forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, // withReuseIdentifier: "Header" // ) // // collectionView.translatesAutoresizingMaskIntoConstraints = false // view.addSubview(collectionView) // // NSLayoutConstraint.activate([ // collectionView.topAnchor.constraint(equalTo: progressContainer.bottomAnchor), // collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor), // collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor), // collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor) // ]) // } // // private func startClassifying() { // // 重置UI // progressView.progress = 0 // statusLabel.text = "正在准备..." // detailProgressLabel.text = "初始化中" // percentageLabel.text = "0%" // resultLabel.text = "" // // // 请求相册权限 // PHPhotoLibrary.requestAuthorization { [weak self] status in // guard let self = self else { return } // // DispatchQueue.main.async { // if status == .authorized { // self.beginPhotoClassification() // } else { // self.statusLabel.text = "需要相册访问权限" // self.detailProgressLabel.text = "请在设置中允许访问相册" // } // } // } // } // // private func beginPhotoClassification() { // statusLabel.text = "正在加载照片..." // // let fetchOptions = PHFetchOptions() // let allPhotos = PHAsset.fetchAssets(with: .image, options: fetchOptions) // // // 更新总数 // detailProgressLabel.text = "共发现 \(allPhotos.count) 张照片" // // photoClassifier.classifyPhotos( // assets: allPhotos, // progressHandler: { [weak self] (stage, progress) in // DispatchQueue.main.async { // self?.updateProgress(stage: stage, progress: progress) // } // }, // completion: { [weak self] result in // guard let self = self else { return } // // DispatchQueue.main.async { // self.updateProgress(stage: "分类完成", progress: 1.0) // // // 更新结果显示 // var resultText = "分类结果:\n" // resultText += "截图:\(result.screenshots.count) 张\n" // resultText += "相似照片组:\(result.similarPhotos.count) 组" // self.resultLabel.text = resultText // // // 更新相似照片展示 // self.similarGroups = result.similarPhotos // self.collectionView.reloadData() // } // } // ) // } // // private func updateProgress(stage: String, progress: Float) { // statusLabel.text = stage // progressView.progress = progress // percentageLabel.text = "\(Int(progress * 100))%" // // switch stage { // case "正在加载照片...": // detailProgressLabel.text = "正在读取照片数据" // case "正在提取特征...": // detailProgressLabel.text = "正在分析照片内容" // case "正在比较相似度...": // detailProgressLabel.text = "正在查找相似照片" // case "分类完成": // detailProgressLabel.text = "处理完成" // default: // break // } // } //} // //// MARK: - UICollectionView DataSource & Delegate //extension LoadingViewController: UICollectionViewDataSource, UICollectionViewDelegate { // func numberOfSections(in collectionView: UICollectionView) -> Int { // return similarGroups.count // } // // func collectionView(_ collectionView: UICollectionView, // numberOfItemsInSection section: Int) -> Int { // return similarGroups[section].count // } // // func collectionView(_ collectionView: UICollectionView, // cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { // let cell = collectionView.dequeueReusableCell( // withReuseIdentifier: "PhotoCell", // for: indexPath // ) as! PhotoCell // // let asset = similarGroups[indexPath.section][indexPath.item] // cell.configure(with: asset) // return cell // } // // func collectionView(_ collectionView: UICollectionView, // viewForSupplementaryElementOfKind kind: String, // at indexPath: IndexPath) -> UICollectionReusableView { // if kind == UICollectionView.elementKindSectionHeader { // let header = collectionView.dequeueReusableSupplementaryView( // ofKind: kind, // withReuseIdentifier: "Header", // for: indexPath // ) as! HeaderView // // let groupCount = similarGroups[indexPath.section].count // header.titleLabel.text = "相似组 \(indexPath.section + 1) (\(groupCount) 张)" // return header // } // return UICollectionReusableView() // } //} // //// MARK: - PhotoCell //class PhotoCell: UICollectionViewCell { // private let imageView = UIImageView() // // override init(frame: CGRect) { // super.init(frame: frame) // setupUI() // } // // required init?(coder: NSCoder) { // fatalError("init(coder:) has not been implemented") // } // // private func setupUI() { // imageView.contentMode = .scaleAspectFill // imageView.clipsToBounds = true // imageView.translatesAutoresizingMaskIntoConstraints = false // contentView.addSubview(imageView) // // NSLayoutConstraint.activate([ // imageView.topAnchor.constraint(equalTo: contentView.topAnchor), // imageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), // imageView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), // imageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor) // ]) // } // // func configure(with asset: PHAsset) { // let options = PHImageRequestOptions() // options.deliveryMode = .fastFormat // // PHImageManager.default().requestImage( // for: asset, // targetSize: CGSize(width: 200, height: 200), // contentMode: .aspectFill, // options: options // ) { [weak self] image, _ in // self?.imageView.image = image // } // } //} // //// MARK: - HeaderView //class HeaderView: UICollectionReusableView { // let titleLabel = UILabel() // // override init(frame: CGRect) { // super.init(frame: frame) // setupUI() // } // // required init?(coder: NSCoder) { // fatalError("init(coder:) has not been implemented") // } // // private func setupUI() { // titleLabel.font = .systemFont(ofSize: 16, weight: .medium) // titleLabel.translatesAutoresizingMaskIntoConstraints = false // addSubview(titleLabel) // // NSLayoutConstraint.activate([ // titleLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 15), // titleLabel.centerYAnchor.constraint(equalTo: centerYAnchor) // ]) // } //}