You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 ?? "未知相册"

图片总数

这里有两种方式,按需选择:

  1. 快速估计:用estimatedAssetCount,优点是快,但早期iOS版本(比如iOS 11及以前)可能是近似值
  2. 精确计数:通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:56:32