一个简洁优雅的 iOS 相册管理应用,采用类似 Tinder 的滑动交互方式,帮助你快速整理照片。
- ✅ 卡片式滑动交互 - 左滑删除,右滑保留,流畅自然
- ✅ 智能日期筛选 - 精确到天的日期范围筛选,支持快速选择
- ✅ 批量删除管理 - 查看标记的照片数量和预计释放的空间
- ✅ 实时进度追踪 - 清晰显示已处理和剩余照片数量
- ✅ 权限智能管理 - 友好的权限请求和状态提示
- 🎨 现代简洁的设计风格
- 🌈 流畅的动画效果和手势反馈
- 🌙 完整支持暗黑模式
- 📱 适配各种屏幕尺寸
- 🎯 直观的视觉指示器(红色删除/绿色保留)
- 框架: SwiftUI + Combine
- 照片处理: PhotoKit
- 架构模式: MVVM
- 最低版本: iOS 16.0+
- 语言: Swift 5.0+
PicPick/
├── Models/ # 数据模型层
│ └── PhotoItem.swift # 照片项目模型
├── Services/ # 服务层
│ └── PhotoService.swift # 相册服务(PhotoKit 封装)
├── ViewModels/ # 视图模型层
│ └── PhotoManagementViewModel.swift # 主视图模型
├── Views/ # 视图层
│ ├── PhotoManagementView.swift # 主视图
│ ├── PhotoCardView.swift # 卡片滑动视图
│ ├── DateFilterView.swift # 日期筛选视图
│ └── DeleteConfirmationView.swift # 删除确认弹窗
├── Assets.xcassets/ # 资源文件
├── Info.plist # 配置文件
└── PicPickApp.swift # App 入口
- macOS 13.0+
- Xcode 15.0+
- iOS 16.0+ 真机或模拟器
-
克隆项目
git clone <repository-url> cd PicPick
-
打开项目
open PicPick.xcodeproj
-
配置 Info.plist(重要!)
如果项目在 Xcode 中没有自动识别 Info.plist,请按以下步骤操作:
a. 在 Xcode 中选择项目根目录 b. 选择 PicPick target c. 进入 Info 选项卡 d. 添加以下权限描述:
Key Value Privacy - Photo Library Usage Description PicPick 需要访问您的相册来帮助您浏览和管理照片。 Privacy - Photo Library Additions Usage Description PicPick 需要此权限来保存照片到您的相册。 或者,在项目设置中指定 Info.plist 文件路径:
- Target Settings → Build Settings
- 搜索 "Info.plist File"
- 设置为:
PicPick/Info.plist
-
运行项目
- 选择目标设备(建议使用真机测试相册功能)
- 点击 Run (⌘R) 或选择菜单 Product → Run
- 启动应用后,会请求相册访问权限
- 点击"授权访问"按钮
- 在系统弹窗中选择"允许访问所有照片"
- 左滑 - 标记照片为删除(显示红色图标)
- 右滑 - 标记照片为保留(显示绿色图标)
- 撤销 - 点击左下角撤销按钮
- 日期筛选 - 点击顶部筛选图标,选择日期范围
- 批量删除 - 点击底部删除按钮,确认后执行删除
- 快速日期选择: 支持"最近 7 天"、"最近 30 天"等快捷选项
- 进度追踪: 顶部实时显示处理进度
- 空间预览: 删除确认时显示将释放的存储空间
- ✅ 必须在 Info.plist 中添加相册权限描述,否则应用会崩溃
- ✅ 建议在真机上测试,模拟器可能无法完全模拟相册功能
- ✅ 使用缩略图加载,避免内存溢出
- ✅ 实现了图片预加载机制
- ✅ 批量操作前会显示预估信息
- ✅ 删除操作需要二次确认
- ✅ 显示清晰的警告提示
- ✅ 删除后无法恢复(系统级删除)
- 顶部:进度条 + 已处理/总数统计
- 中间:卡片式照片展示
- 底部:撤销按钮 + 删除按钮 + 手势提示
- 向左滑动:红色删除指示器逐渐显示
- 向右滑动:绿色保留指示器逐渐显示
- 释放时:超过阈值触发操作,否则回弹
- 开启/关闭筛选开关
- 选择开始和结束日期
- 快速选择常用时间范围
- 显示筛选信息和天数统计
- 显示待删除照片数量
- 显示预计释放的存储空间
- 二次确认 + 警告提示
- 删除过程中显示进度
在 PhotoCardView.swift 中修改:
private let swipeThreshold: CGFloat = 100 // 默认 100在 PhotoManagementViewModel.swift 中修改:
private func preloadNextImages(count: Int = 3) // 默认 3 张在视图文件中搜索 .blue 和 .red,替换为你喜欢的颜色。
解决方案: 检查 Info.plist 是否正确配置了相册权限描述
解决方案:
- 检查权限是否授予
- 前往 设置 → PicPick → 照片 → 选择"所有照片"
解决方案:
- 减少预加载数量
- 降低缩略图目标尺寸
- 确保网络连接(iCloud 照片)
解决方案:
- 检查是否有写入权限
- 确认照片不是系统保护的
- 重启应用后重试
- ✅ MVVM 架构严格分层
- ✅ 所有异步操作使用 async/await
- ✅ SwiftUI 视图拆分为可复用组件
- ✅ 完整的错误处理和用户提示
- ✅ 使用缩略图而非原图
- ✅ 实现图片缓存管理
- ✅ 及时释放不需要的资源
- 🔲 添加照片编辑功能
- 🔲 支持视频管理
- 🔲 添加相册分类
- 🔲 导出功能
- 🔲 云同步支持
本项目仅供学习和参考使用。
欢迎提交 Issue 和 Pull Request!
享受整理照片的乐趣! 📸✨