寫在前面
- 在手機(jī)APP日益增加的前提下隙咸,如何更好的提升用戶的交互體驗(yàn)似乎成為衡量一個(gè)APP重要指標(biāo)沐悦。上述的感悟源于實(shí)際工作的需求成洗,就是在APP中添加一個(gè)更換用戶頭像的功能五督。
- 也許別人會(huì)認(rèn)為這樣一個(gè)小功能不算什么,但從用戶交互角度考慮瓶殃,這樣一個(gè)功能的設(shè)計(jì)有一定學(xué)問充包,待我慢慢道來。
獲取相冊最直接的方式——UIImagePickerController
功能介紹:可直接顯示分組的相處的列表遥椿,用戶選擇不同相冊的照片后基矮,可在委托方法中獲得該圖片對象;
API提供三種數(shù)據(jù)源:
UIImagePickerControllerSourceTypeCamera: //拍照
UIImagePickerControllerSourceTypePhotoLibrary: //相冊
UIImagePickerControllerSourceTypeSavedPhotosAlbum: //圖片庫基本使用
//UIImagePickerController 屬于UIKit
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
// 若設(shè)備支持相機(jī)冠场,使用拍照功能家浇;否則從照片庫中選擇
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
} else {
imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
}
imagePicker.delegate = self; //設(shè)置委托,-
跳轉(zhuǎn)到系統(tǒng)相冊界面
_imagePickerController.allowsEditing = YES;//允許拍照完對照片進(jìn)行裁剪[self presentViewController:_imagePickerController animated:YES completion:nil];
寫到這里碴裙,基本的調(diào)用系統(tǒng)相冊的功能就實(shí)現(xiàn)了钢悲,唯一需要做的是參數(shù)配置
-
遵守的協(xié)議
UINavigationControllerDelegate,UIImagePickerControllerDelegate代理方法 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{ //成功獲取照片 } - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{ //獲取照片失敗 }
-
捕捉多媒體的的類型 UIImagePickerControllerCameraCaptureMode
UIImagePickerControllerCameraCaptureModePhoto,//照片 UIImagePickerControllerCameraCaptureModeVideo//視頻
-
攝像頭的類型 UIImagePickerControllerCameraDevice
UIImagePickerControllerCameraDeviceRear,//后置攝像頭 UIImagePickerControllerCameraDeviceFront //前置攝像頭
-
設(shè)置閃光燈的模式 UIImagePickerControllerCameraFlashMode
UIImagePickerControllerCameraFlashModeOff = -1,//關(guān)閉閃光燈 UIImagePickerControllerCameraFlashModeAuto = 0,//自動(dòng)模式 UIImagePickerControllerCameraFlashModeOn = 1//開啟閃光燈
自定義相冊方式之一 ALAssetsibrary
基本介紹:該框架可實(shí)現(xiàn)自定義相冊,實(shí)現(xiàn)定制的圖片選擇器舔株,可支持多選莺琳、自定義界面,只不過API在iOS9.0版本被標(biāo)記廢棄载慈,即iOS9.0之前的版本可以使用ALAssetsLibrary實(shí)現(xiàn)自定義惭等,iOS9.0之后的版本需要使用Photos.fraework。
-
成員介紹:
1.ALAssetsGroup:映射照片庫(ALAssetsLibrary)中的一個(gè)相冊办铡,通過ALAssetsGroup可以獲取相冊相應(yīng)的信息辞做,以及獲取到對應(yīng)相冊下的所有圖片資源; 2.ALAsset:對應(yīng)相冊中的一張圖片或者一個(gè)視頻寡具,并且包含對應(yīng)圖片和視頻的詳細(xì)信息凭豪,可獲取圖片對應(yīng)的縮略圖,還可通過ALAsset的實(shí)例方法保存圖片和視頻晒杈; 3.ALAssetRepresentation:可簡單理解為對ALAsset的封裝嫂伞,對于給定的ALAsset都至少會(huì)對應(yīng)一個(gè)ALAssetRepresentation,通過ALAsset的實(shí)例方法 defaultRepresentation獲得對應(yīng)的ALAssetRepresentation拯钻,例如使用系統(tǒng)相機(jī)的拍攝的RAW+JPEG照片帖努,則會(huì)有兩個(gè)ALAssetRepresentation,一個(gè)封裝了RAW信息粪般,另一個(gè)封裝了JPEG的信息拼余。通過ALAssetRepresentation可以獲取ALAsset的原圖、全屏圖亩歹、文件名等信息匙监;
-
自定義行相冊的思路
1.實(shí)例化照片庫凡橱,獲取所有的相冊; 2.展示相冊中的所有照片亭姥,可自義展示樣式稼钩,多以集合視圖的形式展現(xiàn); 3.選擇照片后返回上級(jí)界面或者進(jìn)入預(yù)覽圖达罗。
-
具體實(shí)現(xiàn)
1.導(dǎo)入頭文件** #import <AssetsLibrary/ALAssetsLibrary.h>** 或者 ** @import AssetsLibrary;** 2.實(shí)例化AssetsLibrary **ALAssetsLibrary *assertLibray = [[ALAssetsLibrary alloc]init];**
3.遍歷照片庫所有的相冊
groups = [NSMutableArray array]; //遍歷相冊 [assetLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) { if (group) {//遍歷相冊未結(jié)束 //設(shè)置過濾器 [group setAssetsFilter:[ALAssetsFilter allPhotos]]; if (group.numberOfAssets) { [groups addObject:group]; } }else{//遍歷結(jié)束 if (groups.count) { //當(dāng)相冊個(gè)數(shù)不為零時(shí)坝撑,開始遍歷相冊 [self enumenumerateAssets]; }else{ NSLog(@"no group"); } } } failureBlock:^(NSError *error) { if (error) { NSLog(@"error = %@", [error description]); } }];
4.遍歷相冊中的照片
- (void)enumerateAssets{ NSMutableArray *assetArray = [NSMutableArray new]; for (ALAssetsGroup *group in groups) { //遍歷所有的照片-方式一 [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { if (result) { [assetArray addObject:result]; }else{ NSLog(@"here is no photos"); } }]; //遍歷指定索引的照片-方式二 NSInteger fromIndex = 0; NSInteger toIndex = 5; [group enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:toIndex] options:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { if (index > toIndex) { *stop = YES;//遍歷到最后一張,停止遍歷 }else{ if (result) { [assetArray addObject:result];//存儲(chǔ)照片 }else{ NSLog(@"enumeration has ended!"); } } }]; }}
5 完成上述步驟后粮揉,就能獲得所有相冊和相冊中對應(yīng)的所有照片巡李,接下來就可以根據(jù)自己的需求自定義顯示界面了,這里就不再一一贅述了扶认。
自定義相冊方式之二Photos.framework
基本介紹:Photos是蘋果在iOS8.0提出的API侨拦,是目前,蘋果推薦的照片框架辐宾,學(xué)習(xí)一下還是很有必要的狱从;
-
主要成員介紹:
1.PHAsset:代表照片庫中的一個(gè)資源,與ALAsset類似螃概,通過PHAsset可以獲取和保存資源矫夯; 2.PHFetchOptions:獲取資源時(shí)的參數(shù); 3.PHAssetCollection:PHCollection的子類吊洼,表示一個(gè)相冊或者一個(gè)時(shí)刻训貌,也可以是一個(gè)【智能相冊】(系統(tǒng)提供的一系列相冊集合,包括最近刪除冒窍、相機(jī)相冊递沪、最愛相冊等等)中的一個(gè); 4.PHFetchResult:表示一系列資源結(jié)果的集合综液,也可以是相冊資源集合款慨,一般情況下,可以從PHCollection或PHAsset的類方法中獲让ā檩奠; 5.PHImageManager:用于處理資源的加載,圖片加載的過程帶有緩存處理附帽; 6.PHImageRequestOptions:控制加載資源的時(shí)一系列參數(shù)埠戳。
-
具體使用
1.導(dǎo)入框架**@import Photos;** 2.**獲取系統(tǒng)相冊,系統(tǒng)提供下列三種獲取不同分類相冊的方法。** //獲得所有智能相冊 PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; //獲取所有用戶創(chuàng)建的相冊 PHFetchResult *topLevelUserCollections = [PHCollectionList fetchTopLevelUserCollectionsWithOptions:nil]; //獲取所有資源的集合蕉扮,并按資源的創(chuàng)建時(shí)間排序 PHFetchOptions *allPhotoOptions = [[PHFetchOptions alloc] init]; allPhotoOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]]; PHFetchResult *allphotos = [PHAsset fetchAssetsWithOptions:allPhotoOptions];
3 獲取對應(yīng)的照片資源
//列出所有智能相冊整胃,此時(shí)smartAlbums保存是各個(gè)智能相冊對應(yīng)的PHAssetCollection PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; for (NSInteger i = 0; i < smartAlbums.count; i ++) { //從中獲取一相冊 PHCollection *collection = smartAlbums[i]; if ([collection isKindOfClass:[PHAssetCollection class]]) { //判斷是否是PHAssetCollection類 PHAssetCollection *assetCollection = (PHAssetCollection *)collection; //從每個(gè)智能相冊中獲取資源集合,可以看做是PHAsset的集合 PHFetchResult *photoSet = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil]; for (NSInteger j = 0; j < photoSet.count; i ++) { //獲取其中一個(gè)資源 PHAsset *asset = photoSet[i]; } }else{ NSLog(@"not PHAssetCollection"); } } //獲取所有資源的集合,并按資源的創(chuàng)建時(shí)間排序 PHFetchOptions *allPhotoOptions = [[PHFetchOptions alloc] init]; allPhotoOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]]; PHFetchResult *allphotos = [PHAsset fetchAssetsWithOptions:allPhotoOptions]; for (NSInteger i = 0; i < allphotos.count ; i ++) { //獲取一個(gè)資源 PHAsset *asset = allphotos[i]; }
4 顯示圖片資源喳钟,需要用到PHImageManager類
PHImageManager *imageManager = [[PHImageManager alloc]init]; //獲取第一張照片資源 PHAsset *asset = allphotos[0]; //設(shè)定顯示照片的尺寸 CGFloat width = _showImageView.frame.size.width; CGFloat height = _showImageView.frame.size.height; CGSize imageSize = CGSizeMake(width, height); [imageManager requestImageForAsset:asset targetSize:imageSize contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) { //顯示照片 _showImageView.image = result; }];
ALAssetsibrary與Photos的對比
- 適用的iOS版本不同屁使,ALAssetsibrary適用于iOS9.0之前在岂,Photos適用于iOS9.0之后;
- 獲取資源的方式不同:ALAssetsibrary都是以枚舉的方式獲取資源的蛮寂,遍歷照片庫(ALAssetsibrary)獲得相冊(ALAssetsGroup)蔽午,通過遍歷相冊獲得具體資源(ALAsset),枚舉方式獲取資源共郭,存在效率低且不靈活的缺點(diǎn)祠丝;Photos采用拉取的方式獲取資源疾呻,由上述方法可知除嘹,多使用PHFetchResult獲取對應(yīng)資源,不采用枚舉方式獲取資源岸蜗,在效率上會(huì)有所提高尉咕;
以上內(nèi)容均來自工作學(xué)習(xí)中的心得,有不足的地方歡迎大家前來討論璃岳,共同提高年缎。
希望這篇文章能夠給大家的開發(fā)帶來一些便利。