获取相册URL的方法以及通过相册的id获取到该相册的照片资源
我们之前有个需求是 需求直接在界面显示相册的照片 如果大家有需求 可以自取
导入 <Photos/Photos.h>
@property (nonatomic,strong) NSArray <PHFetchResult *>*fetchResults;
@property (nonatomic, strong) NSArray <PHAssetCollection *>*albums;
@property (nonatomic, strong) UIImageView *showImageView;获取相册权限 如果有权限 直接读取相册对应的URL
dispatch_async(dispatch_get_main_queue(), ^{
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
dispatch_async(dispatch_get_main_queue(), ^{
if (status == PHAuthorizationStatusAuthorized) {
[self getImageURLsFromAlbum];
} else {
NSLog(@"没权限");
}
});
}];
});另外说一下 这里用到的自动释放池 @autoreleasepool 顺便插一句 曾经遇到一个面试题 有一个超级大的循环计算,循环里包含大量的临时变量创建时 这时候就要用到这个了
// 获取相册图片URL的方法
- (void)getImageURLsFromAlbum {
@autoreleasepool {
// 获取所有用户创建的相册
PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil];
for (PHAssetCollection *album in userAlbums) {
// 获取相册中的所有图片
PHFetchResult *assets = [PHAsset fetchAssetsInAssetCollection:album options:nil];
for (PHAsset *asset in assets) {
// 获取图片的本地URL
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.synchronous = NO; // 异步获取
[[PHImageManager defaultManager] requestImageDataForAsset:asset
options:options
resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
NSURL *imageURL = [info objectForKey:@"PHImageFileUTIKey"];
if (imageURL) {
NSLog(@"图片URL: %@", imageURL);
} else {
}
}];
}
}
}
}测试数据都在下面的 下面的路径部分 就是拿到的相册id 如果用户从相册中删除该照片资源自然就拿不到了
- (void)testXiangce {
// 相册图片路径
NSString *albumPath = @"700DB459-0810-4235-8E76-E046E000DA4B/L0/001"; // 替换成实际的相册名和图片名
// 根据相册名查找相册
PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
PHFetchResult *topLevelUserCollections = [PHCollectionList fetchTopLevelUserCollectionsWithOptions:nil];
self.fetchResults = @[userAlbums, topLevelUserCollections];
PHAssetCollection *targetAlbum = nil;
NSMutableArray *albums = [NSMutableArray array];
self.albums = [self showAlbums];
for (int i = 0; i < self.albums.count; i++) {
PHAssetCollection *album = self.albums[i];
[albums addObject:album.localizedTitle];
}
for (PHAssetCollection *album in self.albums) {
if ([album.localizedTitle isEqualToString:@"Recents"]) { // 替换成实际的相册名 这个地方可以从相册里面读取到
targetAlbum = album;
break;
}
}
if (targetAlbum) {
// 查找相册中的图片
PHFetchResult *assets = [PHAsset fetchAssetsInAssetCollection:targetAlbum options:nil];
for (PHAsset *asset in assets) {
if ([asset.localIdentifier isEqualToString:albumPath]) {
NSLog(@"%@",asset.localIdentifier);
// 使用PHImageManager加载并显示图片
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.synchronous = NO; // 异步加载
[[PHImageManager defaultManager] requestImageForAsset:asset
targetSize:CGSizeMake(400, 700) // 指定目标大小
contentMode:PHImageContentModeAspectFit
options:options
resultHandler:^(UIImage *result, NSDictionary *info) {
if (result) {
// 在这里处理加载到的图片
// result是加载到的图片
dispatch_async(dispatch_get_main_queue(), ^{
self.showImageView.image = result;
});
}
}];
}
}
}
}- (PHFetchResult *)assetsInAssetCollection:(PHAssetCollection *)album{
PHFetchOptions *options = [[PHFetchOptions alloc] init];
options.predicate = [NSPredicate predicateWithFormat:@"mediaType in %@", @[@(PHAssetMediaTypeImage)]];
options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]];
return [PHAsset fetchAssetsInAssetCollection:(PHAssetCollection *)album options:options];
}- (NSMutableArray *)showAlbums {
PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
PHFetchResult *topLevelUserCollections = [PHCollectionList fetchTopLevelUserCollectionsWithOptions:nil];
self.fetchResults = @[smartAlbums, topLevelUserCollections];
NSMutableArray *albums = [NSMutableArray array];
for (PHFetchResult *fetchResult in self.fetchResults) {
for (PHCollection *collection in fetchResult) {
if ([collection isKindOfClass:[PHAssetCollection class]]) {
PHAssetCollection *assetCollection = (PHAssetCollection *)collection;
PHFetchResult *assets = [self assetsInAssetCollection:assetCollection];
if (assets.count > 0) {
if (assetCollection.assetCollectionSubtype == PHAssetCollectionSubtypeSmartAlbumUserLibrary) {
[albums insertObject:assetCollection atIndex:0];
} else {
[albums addObject:assetCollection];
}
}
}
}
}
return albums;
}
本文是原创文章,完整转载请注明来自 MrXiao's Blog
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果