在这篇文章的基础上,我github开源了一个自定义相册,进行了大量优化以及封装,配合着demo去看,会更容易理解。地址:https://github.com/lovisty/YFPhotoAlbum
越来越多的app选择图片的时候,放弃iOS默认的界面,使用自定义相册去展示,并供用户选择。做到这些,肯定少不了一个获取相册分组和每个分组里的图片的类,这里要展示一下一个Mange应该做的工作。
主要有两个工作,第一,获取相册分组。第二获取每个分组里的照片信息。这里针对iOS8之前的ALAssetsLibrary 和之后的PhotoKit进行阐述。
ALAssetsLibrary
先陈述一下几个类的意义
ALAssetsLibrary:
可以实现查看相册列表,增加相册分组,保存图片到相册等功能。
ALAssetsGroup:
包含了相册分组的信息,分组名称,分组类型,封面图片,分组内资源的数量等信息。
ALAsset:
包含了某个分组里的资源文件,以及图片缩略图,资源类型等其他资源信息。
ALAssetRepresentation:
是通过ALAsset的 defaultRepresentation 方法获取的一个类。
包含了资源文件的更加详细的信息,比如,大小,尺寸,高清图等。
如果在 ALAsset 里找不到,那就到 ALAssetRepresentation 里去逛逛吧,总有新的发现。
看看效(mei)果(nv):
show代码
.h 文件
#import <Foundation/Foundation.h>
#import <AssetsLibrary/AssetsLibrary.h>
typedef void(^AssetsLibraryInfoBlock)(NSArray *groupArray);
typedef void(^ALAssetsBlock)(NSArray *photoArray);
@interface PXPhotoAlbumManger : NSObject
@property (nonatomic, strong) ALAssetsLibrary *assetsLibrary;
@property (nonatomic, copy) AssetsLibraryInfoBlock assetsLibraryInfo; //获取分组列表信息
@property (nonatomic, copy) ALAssetsBlock photosInfoBlock; //获取分组里面的资源信息
- (void)allPhotoGroup:( ALAssetsGroupType )groupType assetsLibraryInfo:(AssetsLibraryInfoBlock)assetsLibraryInfo ALAssetsoInfo:(ALAssetsBlock)ALAssetsoInfo;
- (void)allPhotoInALAssetsGroup:(ALAssetsGroup *)assetsGroup ALAssetsoInfo:(ALAssetsBlock)ALAssetsoInfo;
.m 文件
获取所有分组信息,并获取其中一个指定的分组里的资源
- (void)allPhotoGroup:( ALAssetsGroupType )groupType assetsLibraryInfo:(AssetsLibraryInfoBlock)assetsLibraryInfo ALAssetsoInfo:(ALAssetsBlock)ALAssetsoInfo{
NSMutableArray *groupArray = [NSMutableArray array];
self.assetsLibrary = [[ALAssetsLibrary alloc] init];
@weakify(self)
[self.assetsLibrary enumerateGroupsWithTypes:groupType usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
@strongify(self)
if (group) {
if ([group numberOfAssets] > 0) {
[groupArray addObject:group];
}
}else{
NSArray *resultArray = [[groupArray reverseObjectEnumerator] allObjects];
assetsLibraryInfo(resultArray);
//第一次默认遍历第一个相册分组 用于默认展示
[self allPhotoInALAssetsGroup:[resultArray firstObject] ALAssetsoInfo:^(NSArray *photosInfoArray) {
ALAssetsoInfo(photosInfoArray);
}];
}
} failureBlock:^(NSError *error) {
}];
}
获取指定分组里的资源信息
- (void)allPhotoInALAssetsGroup:(ALAssetsGroup *)assetsGroup ALAssetsoInfo:(ALAssetsBlock)ALAssetsoInfo{
NSMutableArray *assetsArray = [NSMutableArray array];
[assetsGroup enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
if (result != nil) {
[assetsArray addObject:result];
}else{
ALAssetsoInfo(assetsArray);