//以下代码为APP创建一个单独的相册,并将一张图片存入相册。

#import "ViewController.h"

#import <CoreData/CoreData.h>

#import <Photos/Photos.h> //导入头文件

//相册名

#define kAssetCollectionName @"photoCollection"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    UIImage * img = [UIImage imageNamed:@"图片名"];//要保存的图片

    __block NSString * assetLocalIdentifier = nil;//这个属性用于保存要存储的图片标识。

    //系统要求相关操作必须在如下performChanges方法中执行。否则报错。

    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{

        //将图片存入系统相册,并获取图片的标识

        assetLocalIdentifier = [PHAssetCreationRequest creationRequestForAssetFromImage:img].placeholderForCreatedAsset.localIdentifier;

    } completionHandler:^(BOOL success, NSError * _Nullable error) {

        if (!success) {//判断是否保存成功

            NSLog(@"%@",error);

            return ;

        }

        PHAssetCollection * assetCollection = [self getAssetCollection];//获取相册

            [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{

                //获取图片标识

                PHAsset * asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetLocalIdentifier] options:nil].lastObject;

                //创建修改请求

                PHAssetCollectionChangeRequest * request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];

                //利用请求把图片加入相册

                [request addAssets:@[asset]];

            } completionHandler:^(BOOL success, NSError * _Nullable error) {

                if (!success) {//判断是否保存成功

                    NSLog(@"%@",error);

                    return ;

                }

            }];

        }];

}

 

/** 判断相册是否已存在,如不存在则创建一个新的 */

- (PHAssetCollection *)getAssetCollection{

    //获取系统中类型为PHAssetCollectionTypeAlbum的所有相册

    PHFetchResult * fetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];

    for (PHAssetCollection * assetCollection in fetchResult) {//遍历相册

        if ([assetCollection.localizedTitle isEqualToString:kAssetCollectionName]) {//判断相册是否存在

            return assetCollection;//如果相册存在(已创建),则返回相册。

        }

    }//如果判断相册不存在,则自已创建一个相册

    __block NSString * assetCollectionLocalIdentifier = nil;//这个属性用来保存相册标识

    NSError * error = nil;

    [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{

        //创建一个我们自定义的相册,这也算修改相册,顺便获取相册的标识

        assetCollectionLocalIdentifier = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:kAssetCollectionName].placeholderForCreatedAssetCollection.localIdentifier;

    } error:&error];

    if (error) {//如果相册创建失败

        NSLog(@"%@",error);

        return nil;

    }

    //返回相册

    return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[assetCollectionLocalIdentifier] options:nil].lastObject;

}

@end

 

 ****************************以下代码用于从相册中获取图片(只可选一张图片)*******************************************

@interface ViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>//需要遵守协议

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    //如果相册无法打开则直接返回

    if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) return;

    UIImagePickerController * pickerController = [[UIImagePickerController alloc] init];

    pickerController.delegate = self;

    pickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;//打开照片应用,根据返回类型不同,可打开不同相册

    [self presentViewController:pickerController animated:YES completion:nil];

}

 

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{

    UIImage * image = info[UIImagePickerControllerOriginalImage];//拿到图片

    [picker dismissViewControllerAnimated:YES completion:nil];//退出控制器。

}

 

*********下面方法可获取到相机图片库中所有图片**********************

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    PHFetchResult<PHAsset *> * fetchResult = [PHAsset fetchAssetsWithOptions:nil];

    for (PHAsset * asset in fetchResult) {

        //参数二targetSize表示返回图片时,图片的尺寸。例子中是要求返回100宽高的图片。如果我们用CGSizeMake(asset.pixelWidth,asset.pixelWidth)则系统将返回缩略图和原图两份图片。前面一半为缩略图,后面一半为原图。

        [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(100, 100) contentMode:PHImageContentModeDefault options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {

        }];

    }

}

 

 *****************以下代码可以获取所有相册,并拿到每个相册中的图片**********************************

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    PHFetchResult * assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];//获取所有的相册,根据type不同,能拿到不同相册,或只拿某些相册

    for (PHAssetCollection * assetCollection in assetCollections) {//从某个相册中取出所有图片

        PHFetchResult * assets = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];

        for (PHAsset * asset in assets) {

            [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(asset.pixelWidth, asset.pixelHeight) contentMode:PHImageContentModeDefault options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {

                NSLog(@"%@",result);//这里从block的返回值中拿到图片

            }];

        }

    }

}