一、調(diào)起系統(tǒng)相冊(cè)選擇器
- 1.利用UIImagePickerController從系統(tǒng)自帶的App(照片\相機(jī))中獲得圖片
- 2.設(shè)置代理,遵守代理協(xié)議
注意這個(gè)UIImagePickerController類比較特殊,需要遵守兩個(gè)代理協(xié)議
@interface ViewController () <UIImagePickerControllerDelegate, UINavigationControllerDelegate>
- 3.實(shí)現(xiàn)代理的方法didFinishPickingMediaWithInfo
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
-(void)showActionSheet
{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"選擇圖片" message:nil preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *action1 = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
UIAlertAction *action2 = [UIAlertAction actionWithTitle:@"拍照" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSString *mediaType = AVMediaTypeVideo;
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];
if(authStatus == AVAuthorizationStatusRestricted || authStatus == AVAuthorizationStatusDenied){
// mAlertView(@"", @"請(qǐng)?jiān)?設(shè)置'中打開相機(jī)權(quán)限")
return;
}
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
// mAlertView(@"", @"照相機(jī)不可用")
return;
}
UIImagePickerController *vc = [[UIImagePickerController alloc] init];
vc.delegate = self;
vc.allowsEditing = YES;
vc.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentViewController:vc animated:YES completion:nil];
}];
UIAlertAction *action3 = [UIAlertAction actionWithTitle:@"相冊(cè)選擇" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
UIImagePickerController *vc = [[UIImagePickerController alloc] init];
vc.delegate = self;
vc.allowsEditing = YES;
vc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:vc animated:YES completion:nil];
}];
[alert addAction:action1];
[alert addAction:action2];
[alert addAction:action3];
[self presentViewController:alert animated:YES completion:nil];
}
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[picker dismissViewControllerAnimated:YES completion:nil];
}
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];
[self.senderBtn setBackgroundImage:image forState:UIControlStateNormal];
//圖片在這里壓縮一下
NSData *imageData = UIImageJPEGRepresentation(image, 0.5f);
if (imageData.length/1024 > 1024*20)
{
// mAlertView(@"溫馨提示", @"請(qǐng)重新選擇一張不超過(guò)20M的圖片");
}
else
{
// _imageType = [NSData typeForImageData:imageData];
// _imageBase64 = [imageData base64EncodedString];
}
[picker dismissViewControllerAnimated:YES completion:nil];
}
二、獲取系統(tǒng)相冊(cè)所有圖片
- 導(dǎo)入頭文件#import <Photos/Photos.h>
- PHAsset : 一個(gè)資源, 比如一張圖片\一段視頻
- PHAssetCollection : 一個(gè)相簿
- PHImageManager 圖片管理者,是單例,發(fā)送請(qǐng)求才能從asset獲取圖片
- PHImageRequestOptions圖片請(qǐng)求選項(xiàng)
注意:這個(gè)類是iOS8開始推廣,iOS9開始廢棄之前的方法
系統(tǒng)適配iOS8之前,用下面這個(gè)庫(kù)里面的API
import <AssetsLibrary/AssetsLibrary.h>
- 1.獲得相簿全部原圖
- (void)getOriginalImages
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 獲得所有的自定義相簿
PHFetchResult<PHAssetCollection *> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
// 遍歷所有的自定義相簿
for (PHAssetCollection *assetCollection in assetCollections) {
[self enumerateAssetsInAssetCollection:assetCollection original:YES];
}
// 獲得相機(jī)膠卷
PHAssetCollection *cameraRoll = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil].lastObject;
// 遍歷相機(jī)膠卷,獲取大圖
[self enumerateAssetsInAssetCollection:cameraRoll original:YES];
});
}
- 2.獲得相簿中全部縮略圖
- (void)getThumbnailImages
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 獲得所有的自定義相簿
PHFetchResult<PHAssetCollection *> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
// 遍歷所有的自定義相簿
for (PHAssetCollection *assetCollection in assetCollections) {
[self enumerateAssetsInAssetCollection:assetCollection original:NO];
}
// 獲得相機(jī)膠卷
PHAssetCollection *cameraRoll = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil].lastObject;
[self enumerateAssetsInAssetCollection:cameraRoll original:NO];
});
}
- 3.遍歷相冊(cè)
* 遍歷相簿中的全部圖片
* @param assetCollection 相簿
* @param original 是否要原圖
*/
- (void)enumerateAssetsInAssetCollection:(PHAssetCollection *)assetCollection original:(BOOL)original
{
NSLog(@"相簿名:%@", assetCollection.localizedTitle);
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.resizeMode = PHImageRequestOptionsResizeModeFast;
// 同步獲得圖片, 只會(huì)返回1張圖片
options.synchronous = YES;
// 獲得某個(gè)相簿中的所有PHAsset對(duì)象
PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
for (PHAsset *asset in assets) {
// 是否要原圖
CGSize size = original ? CGSizeMake(asset.pixelWidth, asset.pixelHeight) : CGSizeZero;
// 從asset中獲得圖片
__weak typeof(self) weakSelf = self;
[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
NSLog(@"%@", result);
original ? [weakSelf.photoArray addObject:result] : [weakSelf.photoArray addObject:result];
}];
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf.showPhotoCollectionView reloadData];
});
}
}
特別注意:
(1).獲取全部原圖或者全部縮略圖時(shí),運(yùn)行的代碼要放在 全局并行隊(duì)列中
910C933E-8719-4ABD-A24B-547129ED7F7A.png
(2).遍歷相冊(cè)獲取到所有圖片后再主線程中刷新列表
419D68CD-976F-4F16-B09F-9130240FAF95.png
(3).經(jīng)過(guò)本人測(cè)試,放在全局并行隊(duì)列之后獲取相冊(cè)圖片速度都是秒級(jí)可以完成,不會(huì)阻塞主線程。

