iOS中怎么存储照片到自定义相册

在市场上主流App中,大多数App都具有存储图片到自己App的相册中.苹果提供的方法只能存储图片到系统相册,下面讲一下怎么实现:

实现思路:

   1.对系统相册进行操作的前提必须导入#import <Photos/Photos.h>

     2.在用户点击保存之后,首先判断用户是否允许App访问相册.若不是不可以,提醒用户需要打开权限.

     3.进入用户相册之后,首先判断有没有改App储存图片的相册,有的话直接把图片存储进去,没有的话创建一个新的相册.

     4.在图片存储到相册的时候用到占位图片.

具体实现:

    // 1.获取用户授权状态,状态有四种

    // 1) PHAuthorizationStatusNotDetermined  不确定

    // 2)  PHAuthorizationStatusRestricted, 家长控制,拒绝

    // 3)  PHAuthorizationStatusDenied, 拒绝

    // 4) PHAuthorizationStatusAuthorized 授权

    PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];

 // 2.判断用户的授权状态

    if (status == PHAuthorizationStatusNotDetermined) {

            // 如果状态是不确定的话,block中的内容会等到授权完成再调用

        [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {

            // 授权完成就会调用

            if (status == PHAuthorizationStatusAuthorized) {

      //调用存储图片的方法

                [self savePhoto];

            }

        }];

        //如果允许访问

    } else if (status == PHAuthorizationStatusAuthorized) {

   //调用存储图片的方法

        [self savePhoto];

        //如果权限是拒绝

    } else {

        // 使用第三方框架,弹出一个页面提示用户去打开授权

       // [SVProgressHUD showInfoWithStatus:@"进入设置界面->找到当前应用->打开允许访问相册开关"];

    }

 

    #pragma mark - 该方法获取在图库中是否已经创建该App的相册

  //该方法的作用,获取系统中所有的相册,进行遍历,若是已有相册,返回该相册,若是没有返回nil,参数为需要创建  的相册名称

     - (PHAssetCollection *)fetchAssetColletion:(NSString *)albumTitle

    {

             // 获取所有的相册

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

    //遍历相册数组,是否已创建该相册

    for (PHAssetCollection *assetCollection in result) {

        if ([assetCollection.localizedTitle isEqualToString:albumTitle]) {

            return assetCollection;

        }

    }

    return nil;

 }

 

   #pragma mark - 保存图片的方法

   - (void)savePhoto

  {

  //修改系统相册用PHPhotoLibrary单粒,调用performChanges,否则苹果会报错,并提醒你使用

    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{

        

        // 调用判断是否已有该名称相册

       PHAssetCollection *assetCollection = [self fetchAssetColletion:

@"百思"];

        //创建一个操作图库的对象

        PHAssetCollectionChangeRequest *assetCollectionChangeRequest;

        

        if (assetCollection) {

            // 已有相册

            assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];

        } else {

            // 1.创建自定义相册

            assetCollectionChangeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:@"百思"];

        }

        

        // 2.保存你需要保存的图片到系统相册(这里保存的是_imageView上的图片)

        PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:_imageView.image];

        

        // 3.把创建好图片添加到自己相册

   //这里使用了占位图片,为什么使用占位图片呢

  //这个block是异步执行的,使用占位图片先为图片分配一个内存,等到有图片的时候,再对内存进行赋值

        PHObjectPlaceholder *placeholder = [assetChangeRequest placeholderForCreatedAsset];

        [assetCollectionChangeRequest addAssets:@[placeholder]];

        

        

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

        //弹出一个界面提醒用户是否保存成功

        if (error) {

            //[SVProgressHUD showErrorWithStatus:@"保存失败"];

        } else {

           // [SVProgressHUD showSuccessWithStatus:@"保存成功"];

        }

        

        

    }];

}

 

 

     

posted @ 2016-10-28 10:46  木子沉雨  阅读(6006)  评论(0编辑  收藏  举报