项目Demo下载 记得 star哦
先来了解几个类的作用
导入头文件#import <Photos/Photos.h>
PHAsset : 一个资源, 比如一张图片\一段视频
PHAssetCollection : 一个相簿
PHImageManager 图片管理者,是单例,发送请求才能从asset获取图片
PHImageRequestOptions图片请求选项
思路. 通过 API 获取相簿, 再通过相簿获取对应的媒体资源PHAsset,通过资源获取图片
为什么要通过PHAsset 再获取图片. 因为直接给的话. 图片多/大,以及图片的显示十分消耗内存,并且容易导致内存暴涨,页面滑动卡顿等问题.
所以我们要先获取资源对象PHAsset的集合. 再根据需求(图片大小, 是否原图等)通过PHAsset获取图片.获取非常简单,有对应的 API
获取相簿
//获取相簿的所有原图 全局队列
let queue = DispatchQueue.global()
queue.async {
// typedef NS_ENUM(NSInteger, PHAssetCollectionType) {
// PHAssetCollectionTypeAlbum = 1,///这是里对应的 PHAssetCollectionSubtype 用户自定义的相册文件也在其subtype
// PHAssetCollectionTypeSmartAlbum = 2,///对应的为系统里的相册文件 下面的200- 211等都为其subtype
// PHAssetCollectionTypeMoment = 3,
// } NS_ENUM_AVAILABLE_IOS(8_0);
// typedef NS_ENUM(NSInteger, PHAssetCollectionSubtype) {
//
// // PHAssetCollectionTypeAlbum regular subtypes
// PHAssetCollectionSubtypeAlbumRegular = 2,///
// PHAssetCollectionSubtypeAlbumSyncedEvent = 3,
// PHAssetCollectionSubtypeAlbumSyncedFaces = 4,面孔
// PHAssetCollectionSubtypeAlbumSyncedAlbum = 5,
// PHAssetCollectionSubtypeAlbumImported = 6,
//
// // PHAssetCollectionTypeAlbum shared subtypes
// PHAssetCollectionSubtypeAlbumMyPhotoStream = 100,///
// PHAssetCollectionSubtypeAlbumCloudShared = 101,///
//
// // PHAssetCollectionTypeSmartAlbum subtypes collection.localizedTitle
// PHAssetCollectionSubtypeSmartAlbumGeneric = 200,///
// PHAssetCollectionSubtypeSmartAlbumPanoramas = 201,///全景照片
// PHAssetCollectionSubtypeSmartAlbumVideos = 202,///视频
// PHAssetCollectionSubtypeSmartAlbumFavorites = 203,///个人收藏
// PHAssetCollectionSubtypeSmartAlbumTimelapses = 204,///延时摄影
// PHAssetCollectionSubtypeSmartAlbumAllHidden = 205,/// 已隐藏
// PHAssetCollectionSubtypeSmartAlbumRecentlyAdded = 206,///最近添加
// PHAssetCollectionSubtypeSmartAlbumBursts = 207,///连拍快照
// PHAssetCollectionSubtypeSmartAlbumSlomoVideos = 208,///慢动作
// PHAssetCollectionSubtypeSmartAlbumUserLibrary = 209,///所有照片
// PHAssetCollectionSubtypeSmartAlbumSelfPortraits NS_AVAILABLE_IOS(9_0) = 210,///自拍
// PHAssetCollectionSubtypeSmartAlbumScreenshots NS_AVAILABLE_IOS(9_0) = 211,///屏幕快照
// = 1000000201///最近删除知道值为(1000000201)但没找到对应的TypedefName
// // Used for fetching, if you don't care about the exact subtype
// PHAssetCollectionSubtypeAny = NSIntegerMax /所有类型
// } NS_ENUM_AVAILABLE_IOS(8_0);
//获取所有的自定义相簿
let assetCollections = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .albumRegular, options: nil)
print("获取到的相簿 \(assetCollections)")
assetCollections.enumerateObjects {[weak self] collection, index, stop in
print("123213")
self?.enumerateAssetInAssetCollection(assetCollection: collection, original: false)
}
//获得相机胶卷
let cameraRoll = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .smartAlbumUserLibrary, options: nil).lastObject
if let roll = cameraRoll {
self.enumerateAssetInAssetCollection(assetCollection: roll, original: false)
}
}
遍历获取图片
//遍历相册中的图片
func enumerateAssetInAssetCollection(assetCollection: PHAssetCollection,original: Bool) {
print("相册的名字\(assetCollection.localizedTitle)")
//获取某个相簿中的所有 PHAsset 对象
let assets = PHAsset.fetchAssets(in: assetCollection, options: nil)
let options = PHImageRequestOptions()
//调整模式。当size为PHImageManagerMaximumSize时不适用。默认为PHImageRequestOptionsResizeModeFast
options.resizeMode = .fast
////只返回一个结果,阻塞直到可用(或失败)。默认为不
options.isSynchronous = true
//交付模式。默认为PHImageRequestOptionsDeliveryModeOpportunistic
options.deliveryMode = .fastFormat
assets.enumerateObjects { [weak self] asset, index, stop in
let size = original ? CGSize.init(width: asset.pixelWidth, height: asset.pixelHeight) : .zero
PHImageManager.default().requestImage(for: asset, targetSize: size, contentMode: PHImageContentMode.default, options: options) { image, info in
guard let _self = self else {
return
}
if let img = image {
_self.listData.append(img)
}
}
}
DispatchQueue.main.async {
self.collectionView.reloadData()
}
}
网友评论