Swift 4.1中如何获取相册标题、图片数量及缩略图?
嘿,我正好折腾过类似的需求,Photos框架确实比看起来复杂,但把流程拆解开就清晰多了!用Swift 4.1实现你要的「获取相册标题、图片总数、缩略图」需求,我给你一步步讲透:
实现流程拆解
1. 先搞定相册访问权限
这是第一步,没有权限一切都是白搭。首先要在Info.plist里添加权限描述(根据需求选,至少加第一个):
NSPhotoLibraryUsageDescription:说明为什么需要访问相册(比如“需要访问您的相册展示图片”)NSPhotoLibraryAddUsageDescription:如果需要往相册存内容才加
然后在代码里请求权限:
import Photos PHPhotoLibrary.requestAuthorization { status in switch status { case .authorized: // 权限通过,切回主线程处理相册数据 DispatchQueue.main.async { self.loadAlbums() } case .denied, .restricted: // 权限被拒,提示用户去设置开启 print("请在系统设置中开启相册访问权限") case .notDetermined: // 刚请求完一般不会走到这里 break } }
2. 获取系统/用户相册列表
我们要操作的PHAssetCollection对象就是一个个相册。可以通过不同的类型过滤出系统智能相册和用户自定义相册:
- 系统相册(比如相机胶卷、最近项目):用
.smartAlbum类型 - 用户自建相册:用
.album类型
代码示例:
func loadAlbums() { var targetAlbums: [PHAssetCollection] = [] // 获取系统智能相册,过滤掉空相册和不需要的类型(比如最近删除、已隐藏) let smartAlbums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .any, options: nil) smartAlbums.enumerateObjects { collection, _, _ in if collection.estimatedAssetCount > 0 && collection.subtype != .smartAlbumRecentlyDeleted && collection.subtype != .smartAlbumHidden { targetAlbums.append(collection) } } // 获取用户自定义相册,同样过滤空相册 let userAlbums = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: nil) userAlbums.enumerateObjects { collection, _, _ in if collection.estimatedAssetCount > 0 { targetAlbums.append(collection) } } // 遍历所有符合条件的相册,提取信息 targetAlbums.forEach { self.fetchAlbumDetailInfo(album: $0) } }
3. 提取相册核心信息(标题、图片总数)
相册标题
直接取PHAssetCollection的localizedTitle属性,这就是相册在系统里显示的名称:
let albumTitle = album.localizedTitle ?? "未知相册"
图片总数
这里有两种方式,按需选择:
- 快速估计:用
estimatedAssetCount,优点是快,但早期iOS版本(比如iOS 11及以前)可能是近似值 - 精确计数:通过
PHAsset.fetchAssets获取相册内所有图片,再取count(推荐用这个,和系统相册计数一致)
精确计数代码示例(只统计图片,排除视频):
let fetchOptions = PHFetchOptions() // 仅筛选图片类型资源 fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.image.rawValue) // 按创建时间倒序,和系统相册排序逻辑一致 fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] let photoAssets = PHAsset.fetchAssets(in: album, options: fetchOptions) let exactPhotoCount = photoAssets.count
4. 获取相册缩略图
系统相册的缩略图一般是相册内最新的那张图片的缩略图,用PHImageManager请求即可:
// 定义缩略图尺寸,比如80x80(根据你的UI需求调整) let thumbnailSize = CGSize(width: 80, height: 80) let imageManager = PHImageManager.default() // 取相册里的第一张图片(最新的那张) if let firstAsset = photoAssets.firstObject { imageManager.requestImage(for: firstAsset, targetSize: thumbnailSize, contentMode: .aspectFill, options: nil) { thumbnailImage, _ in // 回调在后台线程,切回主线程更新UI DispatchQueue.main.async { // 这里拿到的thumbnailImage就是相册缩略图,赋值给你的UIImageView即可 // albumThumbnailView.image = thumbnailImage } } }
敲黑板!注意事项
- 所有UI更新必须在主线程执行,Photos框架的回调默认在后台线程
- 如果相册为空(虽然我们之前过滤了,但最好加个判断),要显示空相册占位图
- 可以给
requestImage传PHImageRequestOptions,设置同步请求、图片质量等细节参数
这样一套流程走下来,就能完整获取到系统相册启动时展示的所有核心信息啦!
内容的提问来源于stack exchange,提问作者user9494956
相关产品推荐
相关产品推荐

