Apple 关于Photo Library

  • 普通的苹果自带的获取照片方法(一张一张取)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    //设置获取源
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    picker.delegate = self;
    [self presentViewController:picker animated:YES completion:nil];
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    NSLog(@"%@", info);
}

其中获取源类型有以下几种:

typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {
  //相薄模式
    UIImagePickerControllerSourceTypePhotoLibrary,
  //相机模式
    UIImagePickerControllerSourceTypeCamera,
  //时刻照片模式
    UIImagePickerControllerSourceTypeSavedPhotosAlbum
} __TVOS_PROHIBITED;

运行后得到的打印结果:

2017-11-17 12:34:09.337 PhotoOperation[646:10725] {
    UIImagePickerControllerMediaType = "public.image";
    UIImagePickerControllerOriginalImage = " size {4288, 2848} orientation 0 scale 1.000000";
    UIImagePickerControllerReferenceURL = "assets-library://asset/asset.JPG?id=106E99A1-4F6A-45A2-B320-B0AD4A8E8473&ext=JPG";
}

注意:
1.遵守协议
2.在 info.plist 文件中添加Privacy - Photo Library Usage Description 描述

然而,获取单张照片并不能满足用户的需求了,毕竟在要求多张的情况下,一张一张取会降低用户体验。

  • 获取多张照片
    首先要引入库#import
/**
 获得相机胶卷的所有图片
 */
- (void)getImagesFromCameraRoll{
    PHFetchResult *assets = [PHAsset fetchAssetsWithOptions: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);
        }];
    }
}

得到的打印结果:

2017-11-17 13:07:14.817 PhotoOperation[711:20042] , {60, 40}
2017-11-17 13:07:14.823 PhotoOperation[711:20042] , {60, 40}
2017-11-17 13:07:14.829 PhotoOperation[711:20042] , {60, 40}
2017-11-17 13:07:14.838 PhotoOperation[711:20042] , {40, 60}
2017-11-17 13:07:14.844 PhotoOperation[711:20042] , {60, 40}
2017-11-17 13:07:16.581 PhotoOperation[711:20042] , {1668, 2500}
2017-11-17 13:07:16.808 PhotoOperation[711:20042] , {3000, 2002}
2017-11-17 13:07:16.938 PhotoOperation[711:20042] , {3000, 2002}
2017-11-17 13:07:17.177 PhotoOperation[711:20042] , {4288, 2848}
2017-11-17 13:07:17.236 PhotoOperation[711:20042] , {4288, 2848}

注意:前一半是缩略图,后一半是原图,即显示照片数量应该为返回数量的一半。

虽然这样能获取多张图片了,但是如果图片很多的话,用户还是不好选,我们应该考虑先获取相薄,让用户选择相薄后,再选择照片则会容易很多。

  • 获取相机相薄
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    //获取应用自己创建的相薄
    PHFetchResult *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
    for (PHAssetCollection *assetCollection in assetCollections) {
        NSLog(@"1--%@", assetCollection.localizedTitle);
    }
   
    //获取系统的相机胶卷
     PHAssetCollection *cameraRoll = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil].lastObject;
}
  • 获取某个相薄中的所有照片
/**
 获取某个相薄中的所有图片
 @param assetCollection 相薄
 @param original 是否原图
 */
- (void)enumerateAllAssetsInAssetCollection:(PHAssetCollection *)assetCollection original:(BOOL)original{
    //同步获得图片,只会返回1张图片
    PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
    options.synchronous = YES;
    
    //获取某个相薄中的所有PHAsset对象
    PHFetchResult *assets = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
    for (PHAsset *asset in assets) {
        //是否要原图
        CGSize size = original ? CGSizeMake(asset.pixelWidth, asset.pixelHeight) : CGSizeZero;
        //从asset中获取图片
        [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
            NSLog(@"%@", result);
        }];
    }
}

最后,自己弄个 tableView 和 collectionView 就可以自定义多选图控件了。

你可能感兴趣的:(Apple 关于Photo Library)