iOS - Photos框架詳解(調(diào)用系統(tǒng)相冊)

人一切的痛苦,本質(zhì)上都是對自己的無能的憤怒粗俱。


1.相冊訪問權(quán)限
2.相冊中圖片變化的監(jiān)聽
3.讀取相冊中的圖片
4.將圖片保存到相冊

相冊訪問權(quán)限

使用系統(tǒng)相冊的時候,首先判斷是否有權(quán)限寸认,沒有權(quán)限的話,可以彈出提示框偏塞。

PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];  
if (status == PHAuthorizationStatusRestricted ||  
    status == PHAuthorizationStatusDenied) {  
    // 這里便是無訪問權(quán)限  
    //可以彈出個提示框唱蒸,叫用戶去設(shè)置打開相冊權(quán)限
}  else {
    //這里就是用權(quán)限
}

相冊中圖片變化的監(jiān)聽

相冊監(jiān)聽中的回調(diào)方法是在 子線程 中的神汹,因此要改變UI布局的話,必須回到主線程

[[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];    //創(chuàng)建監(jiān)聽者
[[PHPhotoLibrary sharedPhotoLibrary] unregisterChangeObserver:self];    //移除監(jiān)聽者

//相冊變化回調(diào)  
- (void)photoLibraryDidChange:(PHChange *)changeInstance  
{  

    dispatch_sync(dispatch_get_main_queue(), ^{  
        //修改UI
    });  

}  

獲取相冊中的圖片

** 幾個常用的類 **
**PHAsset **: 代表照片庫中的一個資源古今,跟 ALAsset 類似,通過 PHAsset 可以獲取和保存資源捉腥。每個PHAsset就是一張圖片的詳細信息,包括圖片抵碟、位置、時間等拟逮。

** PHFetchOptions **: 獲取資源時的參數(shù)撬统,可以傳 nil敦迄,即使用系統(tǒng)默認值。

** PHFetchResult **: 表示一系列的資源集合罚屋,也可以是相冊的集合。

** PHAssetCollection **: 表示一個相冊或者一個時刻沿后,或者是一個智能相冊(系統(tǒng)提供的特定的一系列相冊沿彭,例如:最近刪除尖滚,視頻列表,收藏等等)漆弄。

** PHImageManager **: 用于處理資源的加載,加載圖片的過程帶有緩存處理撼唾,可以通過傳入一個 PHImageRequestOptions 控制資源的輸出尺寸等規(guī)格。

** PHImageRequestOptions **: 如上面所說,控制加載圖片時的一系列參數(shù)蛛蒙。

// 獲取所有資源的集合,并按資源的創(chuàng)建時間排序
PHFetchOptions *options = [[PHFetchOptions alloc] init];
options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];

//獲取相機膠卷所有圖片
PHFetchResult *assets = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:nil];

PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];

//設(shè)置顯示模式
/*
PHImageRequestOptionsResizeModeNone    //選了這個就不會管傳如的size了 牵祟,要自己控制圖片的大小,建議還是選Fast
PHImageRequestOptionsResizeModeFast    //根據(jù)傳入的size诺苹,迅速加載大小相匹配(略大于或略小于)的圖像 
PHImageRequestOptionsResizeModeExact    //精確的加載與傳入size相匹配的圖像 
*/
option.resizeMode = PHImageRequestOptionsResizeModeFast;
option.synchronous = NO;
option.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;

CGFloat scale = [UIScreen mainScreen].scale;
CGSize screenSize = [UIScreen mainScreen].bounds.size;

typeof(self)weakSelf = self;
for (PHAsset *asset in assets) {
    
    [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(screenSize.width*scale, screenSize.height*scale) contentMode:PHImageContentModeAspectFit options:option resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
        //我這里用個模型接儲存了圖片的 localIdentifier 和圖片本身
        //還有很多信息,根據(jù)自己的需求來取
        CellModel * model = [CellModel new];
        model.localIdentifier = asset.localIdentifier;
        model.image = [UIImage imageWithData:UIImageJPEGRepresentation(result, 0.5)];
        
        [weakSelf.cellImageArray addObject:model];
        
        dispatch_async(dispatch_get_main_queue(), ^{
            [weakSelf reloadData];
        });
        
    }];
    
}

將圖片保存到相冊

  • 方法一:
    • 優(yōu)點:簡單快捷
    • 缺點:無法直接保存到自定義相冊
- (IBAction)savePhoto {
    //  - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;
    //只能保存到相機膠卷(不能保存到自定義相冊)
    UIImageWriteToSavedPhotosAlbum(self.Photo.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}

//回調(diào)判斷保存是否成功
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
    if (error) {
        //保存失敗
    }else{
        //保存成功
    }
}
  • ** 方法二: **
    • 優(yōu)點:能夠保存到任何相冊
    • 缺點:沒有第一種方法簡單
 // 添加圖片到自己相冊
 - (void)savePhoto
 {
     [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
         // 1.創(chuàng)建圖片請求類(創(chuàng)建系統(tǒng)相冊中新的圖片)PHAssetCreationRequest
         // 把圖片放在系統(tǒng)相冊
         PHAssetCreationRequest *assetCreationRequest = [PHAssetCreationRequest creationRequestForAssetFromImage:_imageView.image];
        
         // 2.創(chuàng)建相冊請求類(修改相冊)PHAssetCollectionChangeRequest
         PHAssetCollectionChangeRequest *assetCollectionChangeRequest = nil;
        
         // 獲取之前相冊
         PHAssetCollection *assetCollection = [self fetchAssetCollection:@"百思不得姐"];
        
         // 判斷是否已有相冊
         if (assetCollection) {
             // 如果存在已有同名相冊   指定這個相冊,創(chuàng)建相冊請求修改類  
             assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
         } else {  //不存在,創(chuàng)建新的相冊
             assetCollectionChangeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:@"百思不得姐"];
         } 
         // 3.把圖片添加到相冊中
         // NSFastEnumeration:以后只要看到這個,就可以表示數(shù)組
         //assetCreationRequest.placeholderForCreatedAsset 圖片請求類占位符(相當于一個內(nèi)存地址) 
          //因為creationRequestForAssetFromImage方法是異步實行的,在這里不能保證 assetCreationRequest有值
  
         [assetCollectionChangeRequest addAssets:@[assetCreationRequest.placeholderForCreatedAsset]];
  
     } completionHandler:^(BOOL success, NSError * _Nullable error) {
        
         if (success) {
             [SVProgressHUD showSuccessWithStatus:@"保存成功"];
         } else {
             [SVProgressHUD showErrorWithStatus:@"保存失敗"];
         }
        
     }];
 }
 
 // 指定相冊名稱,獲取相冊
 - (PHAssetCollection *)fetchAssetCollection:(NSString *)title
 {
     // 獲取相簿中所有自定義相冊
     PHFetchResult *result = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
     遍歷相冊,判斷是否存在同名的相冊
     for (PHAssetCollection *assetCollection in result) {
         if ([title isEqualToString:assetCollection.localizedTitle]) {  存在,就返回這個相冊
             return assetCollection;
         }
     }  
     return nil;
 }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掌呜,一起剝皮案震驚了整個濱河市坪哄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌损姜,老刑警劉巖饰剥,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摧阅,死亡現(xiàn)場離奇詭異绷蹲,居然都是意外死亡,警方通過查閱死者的電腦和手機祝钢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門比规,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拦英,“玉大人,你說我怎么就攤上這事疤估。” “怎么了铃拇?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長慷荔。 經(jīng)常有香客問我雕什,道長,這世上最難降的妖魔是什么贷岸? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮凰盔,結(jié)果婚禮上粉寞,老公的妹妹穿的比我還像新娘馅闽。我一直安慰自己,他們只是感情好场靴,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布忠怖。 她就那樣靜靜地躺著,像睡著了一般凡泣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上皮假,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音惹资,去河邊找鬼。 笑死褪测,一個胖子當著我的面吹牛猴誊,可吹牛的內(nèi)容都是我干的侮措。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼分扎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了畏吓?” 一聲冷哼從身側(cè)響起墨状,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤庵佣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后巴粪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粥谬,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年漏策,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臼氨。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖储矩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情持隧,我是刑警寧澤即硼,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布屡拨,位于F島的核電站,受9級特大地震影響呀狼,放射性物質(zhì)發(fā)生泄漏裂允。R本人自食惡果不足惜哥艇,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望她奥。 院中可真熱鬧怎棱,春花似錦哩俭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谬运。三九已至,卻和暖如春梆暖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背轰驳。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工厚掷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冒黑。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像抡爹,于是被迫代替她去往敵國和親掩驱。 傳聞我的和親對象是個殘疾皇子冬竟,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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