iOS中,系統(tǒng)相冊的那些事

拍照也是一門技術(shù)

寫在前面

  • 在手機(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ā)帶來一些便利。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铃慷,一起剝皮案震驚了整個(gè)濱河市单芜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌犁柜,老刑警劉巖洲鸠,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異馋缅,居然都是意外死亡扒腕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門萤悴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘾腰,“玉大人,你說我怎么就攤上這事覆履√E瑁” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵硝全,是天一觀的道長栖雾。 經(jīng)常有香客問我,道長柳沙,這世上最難降的妖魔是什么岩灭? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮赂鲤,結(jié)果婚禮上噪径,老公的妹妹穿的比我還像新娘柱恤。我一直安慰自己,他們只是感情好找爱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布梗顺。 她就那樣靜靜地躺著,像睡著了一般车摄。 火紅的嫁衣襯著肌膚如雪寺谤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天吮播,我揣著相機(jī)與錄音变屁,去河邊找鬼。 笑死意狠,一個(gè)胖子當(dāng)著我的面吹牛粟关,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播环戈,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼闷板,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了院塞?” 一聲冷哼從身側(cè)響起遮晚,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拦止,沒想到半個(gè)月后县遣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡创泄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年艺玲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鞠抑。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饭聚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搁拙,到底是詐尸還是另有隱情秒梳,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布箕速,位于F島的核電站酪碘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏盐茎。R本人自食惡果不足惜兴垦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧探越,春花似錦狡赐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鲤氢,卻和暖如春搀擂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卷玉。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工哨颂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人揍庄。 一個(gè)月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓咆蒿,卻偏偏與公主長得像东抹,于是被迫代替她去往敵國和親蚂子。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容