Photos是什么
Photos是蘋(píng)果全新的照片框架,其要求最低版本為iOS8.利用Photos可以實(shí)現(xiàn)以下功能:
- 訪(fǎng)問(wèn)相冊(cè)中的圖片和視頻
- 為照片(蘋(píng)果APP)提供編輯擴(kuò)展
- 訪(fǎng)問(wèn)iCloud上的圖片和視頻
權(quán)限
使用前一定要檢查權(quán)限,使用如下方法:
switch PHPhotoLibrary.authorizationStatus() {
case .Denied:
// 用戶(hù)拒絕,提示開(kāi)啟
case .NotDetermined:
// 尚未請(qǐng)求,立即請(qǐng)求
PHPhotoLibrary.requestAuthorization({ (status) -> Void in
if status == .Authorized {
// 用戶(hù)同意
}
})
return false
case .Restricted:
// 用戶(hù)無(wú)法解決的無(wú)法訪(fǎng)問(wèn)
case .Authorized:
// 用戶(hù)已授權(quán)
}
獲取資源
首先需要說(shuō)明下PHFetchResult,所有fetch動(dòng)作獲取到的結(jié)果封裝到這個(gè)類(lèi)中.它里面可能是Asset,也可能是Collection.
1.獲取全部照片
let options = PHFetchOptions()
options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)] // 以創(chuàng)建時(shí)間排序
let allPhotos = PHAsset.fetchAssetsWithOptions(options) // 類(lèi)型[PHAsset]
2.獲取全部系統(tǒng)相冊(cè)
let smartAlbums = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .AlbumRegular, options: nil) // 類(lèi)型[PHAssetCollection]
3.獲取全部用戶(hù)相冊(cè)
let topLevelUserCollections = PHAssetCollection.fetchTopLevelUserCollectionsWithOptions(nil) // 類(lèi)型[PHAssetCollection]
4.獲取單個(gè)資源
使用PHImageManager或其子類(lèi)PHCachingImageManager用來(lái)加載資源.有一系列request方法可供選擇.例如:
// options可用于限定獲取質(zhì)量和途徑,以及進(jìn)度回調(diào)等
PHCachingImageManager().requestImageForAsset(asset, targetSize: assetGridThumbnailSize, contentMode: .AspectFill, options: nil, resultHandler: { (image, info) in
// 獲取到UIImage結(jié)果,info中包含了圖片質(zhì)量等信息
})
篩選條件
我們?cè)趂etch時(shí)可以使用PHFetchOptions用來(lái)篩選.
- predicate: 可用于匹配篩選
- sortDescriptors: 可用于排序
- includeHiddenAssets: 是否包含隱藏圖片(默認(rèn)false)
- includeAllBurstAssets: 是否包含連拍圖片(默認(rèn)false)
- includeAssetSourceTypes(iOS9+): 指定來(lái)源(iCloud,iTunes等)
- fetchLimit(iOS9+): 獲取數(shù)量限制
- wantsIncrementalChangeDetails: 是否需要改善的細(xì)節(jié)(當(dāng)收到Change通知時(shí),稍后講到,默認(rèn)true)
PHPhotoLibraryChangeObserver
Photos允許我們監(jiān)聽(tīng)相冊(cè)改變的通知,首先我們需要注冊(cè)監(jiān)聽(tīng):
PHPhotoLibrary.sharedPhotoLibrary().registerChangeObserver(self)
另外不要忘記在deinit時(shí)注銷(xiāo)(或其他合適的時(shí)機(jī)):
deinit {
PHPhotoLibrary.sharedPhotoLibrary().unregisterChangeObserver(self)
}
實(shí)現(xiàn)PHPhotoLibraryChangeObserver協(xié)議只需一個(gè)方法
func photoLibraryDidChange(changeInstance: PHChange) {
if let changeDetails = changeInstance.changeDetailsForFetchResult(result) {
let updatedResult = changeDetails.fetchResultAfterChanges
// reload data
}
}
之前提到Options中的wantsIncrementalChangeDetails設(shè)為false時(shí),獲取的changeDetails的remove,insert,change和move的狀態(tài)相關(guān)的參數(shù)均無(wú)法獲取真正的值.
Photos是一個(gè)很大的框架,我們只談?wù)摿巳绾潍@取圖片,其實(shí)還有很多功能沒(méi)有提到,有時(shí)間我會(huì)寫(xiě)一個(gè)續(xù)篇.