PhotoKit是一套比AssetsLibrary更完整也更高效的庫,而其處理方式也跟AssetsLibrary有很大的不同。該框架不僅支持照片的編輯
,還提供了直接訪問
照片管理應(yīng)用程序里的照片和視頻資源,包括iCloud照片庫。我們可以使用這個(gè)框架來檢索相冊資源顯示和播放泥畅,且編輯他們的圖像或視頻內(nèi)容。
PhotoKit組成
從官方文檔可以看出琅翻,其成員比較多位仁,下面只介紹幾個(gè)比較常用的:
- PHAsseet:代表照片庫中的一個(gè)資源柑贞,跟 ALAsset 類似,通過 PHAsset 可以獲取和保存資源;
- PHFetchOptions:獲取資源時(shí)的參數(shù)聂抢,可以傳nil钧嘶,即使用系統(tǒng)默認(rèn)值;
- PHFetchResult:表示一系列的資源集合琳疏,也可以是相冊的集合有决;
- PHAssetCollection:表示一個(gè)相冊或者一個(gè)時(shí)刻,或者是一個(gè)「智能相冊(系統(tǒng)提供的特定的一系列相冊空盼,例如:最近刪除书幕,視頻列表,收藏等等);
- PHCollectionList:表示一組PHCollection,而它本身也是一個(gè)PHCollection,因此PHCollection作為一個(gè)集合我注,可以包含其他集合按咒;
- PHImageManager:用于處理資源的加載,加載圖片的過程帶有緩存處理但骨,可以通過傳入一個(gè) PHImageRequestOptions 控制資源的輸出尺寸等規(guī)格;
- PHImageRequestOptions:如上面所說励七,控制加載圖片時(shí)的一系列參數(shù)。
還有PHChange
奔缠、
PHAssetChangeRequest
掠抬、PHContentEditingInput
、PHContentEditingOutput
等進(jìn)行照片資源內(nèi)容編輯操作的類和其他的一些類校哎。
PhotoKit的使用
訪問相冊資源
以下是官方demo的代碼片段:
PHFetchOptions *allPhotosOptions = [[PHFetchOptions alloc] init];
allPhotosOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
PHFetchResult *allPhotos = [PHAsset fetchAssetsWithOptions:allPhotosOptions];
PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum
subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
PHFetchResult *topLevelUserCollections = [PHCollectionList fetchTopLevelUserCollectionsWithOptions:nil];
對上面這段代碼進(jìn)行分析:首先創(chuàng)建一個(gè)PHFetchOptions對象两波,然后設(shè)立其根據(jù)創(chuàng)建時(shí)間排序的option,使用fetchAssetsWithOptions:
方法獲取所有的相片資源闷哆;而使用fetchAssetCollectionsWithType:
方法根據(jù)特定的type獲取指定類型的相冊腰奋;使用fetchTopLevelUserCollectionsWithOptions:
方法可以獲取所有用戶創(chuàng)建的相冊。
以上是獲取資源抱怔,下面來分析怎樣獲取可供直接展示的資源:
// Request an image for the asset from the PHCachingImageManager.
[self.imageManager requestImageForAsset:asset
targetSize:AssetGridThumbnailSize
contentMode:PHImageContentModeAspectFill
options:nil
resultHandler:^(UIImage *result, NSDictionary *info) {
// Set the cell's thumbnail image if it's still showing the same asset.
if ([cell.representedAssetIdentifier isEqualToString:asset.localIdentifier]){
cell.thumbnailImage = result;
}
}];
imageManager是一個(gè)PHCachingImageManager對象劣坊,使用requestImageForAsset:targetSize:contentMode:options:resultHandler:
方法最后返回的result即為需要的image;而PHCachingImageManager這個(gè)類還有另外一個(gè)方法:startCachingImagesForAssets:targetSize:contentMode:options:
給指定相片資源做緩存屈留。如果是視頻資源則可以如下獲染直:
// Request an AVAsset for the PHAsset we're displaying.
[[PHImageManager defaultManager] requestAVAssetForVideo:self.asset options:nil resultHandler:^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary *info) {
CALayer *viewLayer = self.view.layer;
// Create an AVPlayerItem for the AVAsset.
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:avAsset];
playerItem.audioMix = audioMix;
// Create an AVPlayer with the AVPlayerItem.
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
// Create an AVPlayerLayer with the AVPlayer.
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
// Configure the AVPlayerLayer and add it to the view.playerLayer.videoGravity =AVLayerVideoGravityResizeAspect;
playerLayer.frame = CGRectMake(0, 0, viewLayer.bounds.size.width, viewLayer.bounds.size.height);
[viewLayer addSublayer:playerLayer];
[player play];
});
}];
avAsset就是返回的視頻資源。
相冊的添加灌危、刪除康二、編輯以及處理變更
在做這些操作之前需要添加PHPhotoLibraryChangeObserver
協(xié)議,然后注冊PHPhotoLibrary的觀察者:
[[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];
至于具體的操作勇蝙,官方文檔有關(guān)于添加
沫勿、刪除
、編輯
相冊的例子:Requesting Changes to the Photo Library。之后藕帜,實(shí)現(xiàn)PHPhotoLibraryChangeObserver的協(xié)議方法:photoLibraryDidChange:
就OK了烫罩,而關(guān)于處理變更
也有例子:Handling Changes:An Example,。當(dāng)然洽故,最后記得在dealloc方法里注銷這個(gè)協(xié)議:
[[PHPhotoLibrary sharedPhotoLibrary] unregisterChangeObserver:self];
Asset照片或視頻資源的刪除、編輯
其中一些固有的操作盗誊,可直接使用removeAssets:
时甚、deleteAssets:
等方法來實(shí)現(xiàn):
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
[PHAssetChangeRequest deleteAssets:@[self.asset]];
} completionHandler:completionHandler];
而其他的一些編輯處理,比如自定義操作哈踱。使用PHAssetChangeRequest的contentEditingOutput
的屬性對象荒适,這就需要我們創(chuàng)建一個(gè)PHContentEditingOutput
對象,然后進(jìn)行相應(yīng)的編輯處理开镣。其中可能用到PHAdjustmentData這個(gè)類對操作進(jìn)行標(biāo)記描述刀诬。而這些都是寫在requestContentEditingInputWithOptions:completionHandler:
這個(gè)方法里的。最后實(shí)現(xiàn)PHPhotoLibrary的performChanges:completionHandler:
方法邪财。
擴(kuò)展
參考鏈接及擴(kuò)展閱讀:照片框架陕壹、官方demo、PhotoKit詳解(上)树埠、PhotoKit詳解(下)糠馆、PhotoKit實(shí)踐及坑點(diǎn)、NSHipster/PHImageManager
可以觀看WWDC session --- Introducing the Photos Frameworks 視頻學(xué)習(xí)更多內(nèi)容怎憋,發(fā)掘更深的知識又碌,然后自己寫一些demo。
Github上有個(gè)不錯(cuò)的照片瀏覽第三框架:MWPhotoBrowser