移動端訪問不佳,請訪問我的個人博客
很早之前就用OC把代碼寫完了并用在項目中了,1直沒時間整理,現(xiàn)在用swift重寫1份,并且更加詳細的來了解這個Photos框架,下面是我集合蘋果官方文檔和其他大神的博客寫出的1篇關(guān)于Photos框架的介紹
老規(guī)矩先上效果圖和Demo地址:
Photos是ios8出的1個新的圖片選擇框架,取代之前的AssetsLibrary框架,相比較AssetsLibrary框架Photos的用法更加靈活,發(fā)現(xiàn)在iOS9中AssetsLibrary已被棄用了,并且也不支持livePhoto,iOS9上再使用AssetsLibrary框架時還有個嚴重的問題就是圖片分辨率會變的很低,這篇文章主要講授1下Photos的簡單用法,用它做1個簡單的圖片選擇器。
Photos中各個類的簡單解釋:
類名 | 作用 |
---|---|
PHAdjustmentData | 當用戶編輯資源,照片與修改后的圖象或視頻數(shù)據(jù)保存在1個PHAdjustmentData對象中 |
PHAsset | 代表照片庫中的1個資源實體,可以理解為1張照片,在打印的時候,可以清楚的看見里面包括了照片的時間、標題等信息 |
PHAssetChangeRequest | 使用PHAssetChangeRequest對象來創(chuàng)建、刪除和修改相片庫里面的PHAsset對象 |
PHAssetCollectionChangeRequest | 使用PHAssetCollectionChangeRequest對象來創(chuàng)建、刪除和修改相片庫里面的PHAssetCollection對象 |
PHAssetCreationRequest | 使用PHAssetCreationRequest對象構(gòu)造1個新的照片或視頻,并將其添加到照片庫 |
PHAssetResource | 1個PHAssetResource對象表示在照片庫中的照片或視頻資源(也就是1個PHAsset對象)相干聯(lián)的基礎數(shù)據(jù)資源之1,使用PHAssetResourceManager類獲得它 |
PHAssetResourceManager | PHAssetResourceManager對象提供了訪問與照片資源相干的資源基礎數(shù)據(jù)存儲方法 |
PHChange | PHChange對象來通知的照片庫中的資源的1些變法,比如增加和刪除 |
PHCollection | PHAssetCollection對象表示1組照片或視頻資源。包括時刻和相冊中可見照片利用,和特殊的集合,如同享照片流。 |
PHCollectionListChangeRequest | 使用PHCollectionListChangeRequest對象在1個照片庫中創(chuàng)建、刪除或修改PHCollectionList對象。 |
PHContentEditingInput | PHContentEditingInput對象描寫資產(chǎn)用于編輯元數(shù)據(jù) |
PHContentEditingOutput | PHContentEditingOutput對象表示編輯照片資產(chǎn)的照片或視頻內(nèi)容的結(jié)果 |
PHFetchOptions | 獲得資源時的檢索參數(shù),可以傳 nil,即便用系統(tǒng)默許值 |
PHFetchResult | 通過PHFetchResult來獲得照片實體的有序列表 |
PHImageManager | PHImageManager對象提供用于加載與PHAsset對象相干聯(lián)的圖象或視頻數(shù)據(jù)的方法。使用這些方法來獲得全尺寸照片資產(chǎn)或縮略圖,或檢索AV Foundation對象播放,導出和操縱的視頻資產(chǎn)。 |
PHLivePhoto | 用來獲得LivePhoto實體 |
PHObject | 照片等實體的抽象類 |
PHPhotoLibrary | PHPhotoLibrary對象表示用戶的照片庫整套資源和收藏的照片,包括存儲在本地裝備上在iCloud的照片對象。 |
PhotosTypes | 與Photos框架相干的類型的枚舉 |
獲得相冊列表可以需要用到1下類:
下面是獲得相冊列表的代碼片斷:
//MARK: 屬性列表
//全部相冊的數(shù)組
private(set) var photoAlbums = [[String: PHFetchResult<PHAsset>]]()
private(set) var selectPhotoArr = [PHAsset]()
//是不是同步要求圖片
public var isSynchronous: Bool = false {
didSet{
self.photoOption.isSynchronous = isSynchronous
}
}
//MARK: 初始化方法
override init() {
super.init()
//圖片要求設置成快速獲得
self.photoOption.resizeMode = .fast
self.photoOption.deliveryMode = .opportunistic
getPhotoAlbum()
}
/**
開始獲得獲得相冊列表
*/
private func getPhotoAlbum() {
//創(chuàng)建1個PHFetchOptions對象檢索照片
let options = PHFetchOptions()
//通過創(chuàng)建時間來檢索
options.sortDescriptors = [NSSortDescriptor.init(key: photoCreationDate, ascending: false)]
//通過數(shù)據(jù)類型來檢索,這里為只檢索照片
options.predicate = NSPredicate.init(format: "mediaType in %@", [PHAssetMediaType.image.rawValue])
//通過檢索條件檢索出符合檢索條件的所有數(shù)據(jù),也就是所有的照片
let allResult = PHAsset.fetchAssets(with: options)
//獲得用戶創(chuàng)建的相冊
let userResult = PHAssetCollection.fetchTopLevelUserCollections(with: nil)
//獲得智能相冊
let smartResult = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: nil)
//將獲得的相冊加入到相冊的數(shù)組中
photoAlbums.append([WCLImagePickerBundle.localizedString(key: "全部照片"): allResult])
userResult.enumerateObjects(options: .concurrent) { (collection, index, stop) in
let assetcollection = collection as! PHAssetCollection
//通過檢索條件從assetcollection中檢索出結(jié)果
let assetResult = PHAsset.fetchAssets(in: assetcollection, options: options)
if assetResult.count != 0 {
self.photoAlbums.append([assetcollection.localizedTitle!:assetResult])
}
}
smartResult.enumerateObjects(options: .concurrent) { (collection, index, stop) in
//通過檢索條件從assetcollection中檢索出結(jié)果
let assetResult = PHAsset.fetchAssets(in: collection, options: options)
if assetResult.count != 0 {
self.photoAlbums.append([collection.localizedTitle!:assetResult])
}
}
}
需要用到的類:
下面貼代碼片斷:
/**
通過下標返回相冊的PHFetchResult
- parameter index: 選擇相冊的index
- returns: 相冊的PHFetchResult
*/
public func getAblumResult(_ ablumIndex: Int) -> PHFetchResult<PHAsset>? {
if let ablum = self.photoAlbums[wcl_safe: ablumIndex] {
if let result = ablum.values.first {
return result
}
}
return nil
}
上面代碼中返回的result
就代表選中的相冊的圖片列表
通過上面獲得到的相冊的圖片列表通過下標就可以取得到圖片對應的PHAsset
,需要用到的類:
下面是代碼片斷:
/**
根據(jù)PHAsset獲得photo
- parameter ablumIndex: 相冊的index
- parameter alasset: 相冊里圖片的PHAsset
- parameter photoSize: 圖片的size
- parameter resultHandler: 返回照片的回調(diào)
*/
public func getPhoto(_ photoSize: CGSize, alasset: PHAsset?, resultHandler: ((UIImage?, [AnyHashable: Any]?) -> Void)?) {
if alasset != nil {
let scale = UIScreen.main.scale
let photoScaleSize = CGSize(width: photoSize.width*scale, height: photoSize.height*scale)
self.photoManage.requestImage(for: alasset!, targetSize: photoScaleSize, contentMode: .aspectFill, options: self.photoOption, resultHandler: { (image, infoDic) in
if image != nil {
resultHandler?(image, infoDic)
}else {
//沒獲得到返回默許圖片
let image_buffer = WCLImagePickerBundle.imageFromBundle("image-buffer")
resultHandler?(image_buffer, infoDic)
}
})
}
}
有時候我們需要將利用里的圖片存到相冊里面,1下是會用到的類:
代碼片斷:
//履行變化
PHPhotoLibrary.shared().performChanges({
//創(chuàng)建1個圖片資源
PHAssetChangeRequest.creationRequestForAsset(from: image)
}, completionHandler: { (flag, error) in
//履行結(jié)果回調(diào)
})
以上簡單的講授了1下Photos相干知識點和使用方法,更多的可以去官方文檔上去查看。用Photos自己寫了1個圖片選擇器,大家有興趣的可以去看1下,有用的話可以star1下,寫不不是很好,有甚么毛病可以指出來~最后謝謝大家的瀏覽。