移动端访问不佳,请访问我的个人博客
很早之前就用OC把代码写完了并用在项目中了,1直没时间整理,现在用swift重写1份,并且更加详细的来了解这个Photos框架,下面是我集合苹果官方文档和其他大神的博客写出的1篇关于Photos框架的介绍
老规矩先上效果图和Demo地址:
Photos是ios8出的1个新的图片选择框架,取代之前的AssetsLibrary框架,相比较AssetsLibrary框架Photos的用法更加灵活,发现在iOS9中AssetsLibrary已被弃用了,并且也不支持livePhoto,iOS9上再使用AssetsLibrary框架时还有个严重的问题就是图片分辨率会变的很低,这篇文章主要讲授1下Photos的简单用法,用它做1个简单的图片选择器。
Photos中各个类的简单解释:
类名 | 作用 |
---|---|
PHAdjustmentData | 当用户编辑资源,照片与修改后的图象或视频数据保存在1个PHAdjustmentData对象中 |
PHAsset | 代表照片库中的1个资源实体,可以理解为1张照片,在打印的时候,可以清楚的看见里面包括了照片的时间、标题等信息 |
PHAssetChangeRequest | 使用PHAssetChangeRequest对象来创建、删除和修改相片库里面的PHAsset对象 |
PHAssetCollectionChangeRequest | 使用PHAssetCollectionChangeRequest对象来创建、删除和修改相片库里面的PHAssetCollection对象 |
PHAssetCreationRequest | 使用PHAssetCreationRequest对象构造1个新的照片或视频,并将其添加到照片库 |
PHAssetResource | 1个PHAssetResource对象表示在照片库中的照片或视频资源(也就是1个PHAsset对象)相干联的基础数据资源之1,使用PHAssetResourceManager类获得它 |
PHAssetResourceManager | PHAssetResourceManager对象提供了访问与照片资源相干的资源基础数据存储方法 |
PHChange | PHChange对象来通知的照片库中的资源的1些变法,比如增加和删除 |
PHCollection | PHAssetCollection对象表示1组照片或视频资源。包括时刻和相册中可见照片利用,和特殊的集合,如同享照片流。 |
PHCollectionListChangeRequest | 使用PHCollectionListChangeRequest对象在1个照片库中创建、删除或修改PHCollectionList对象。 |
PHContentEditingInput | PHContentEditingInput对象描写资产用于编辑元数据 |
PHContentEditingOutput | PHContentEditingOutput对象表示编辑照片资产的照片或视频内容的结果 |
PHFetchOptions | 获得资源时的检索参数,可以传 nil,即便用系统默许值 |
PHFetchResult | 通过PHFetchResult来获得照片实体的有序列表 |
PHImageManager | PHImageManager对象提供用于加载与PHAsset对象相干联的图象或视频数据的方法。使用这些方法来获得全尺寸照片资产或缩略图,或检索AV Foundation对象播放,导出和操纵的视频资产。 |
PHLivePhoto | 用来获得LivePhoto实体 |
PHObject | 照片等实体的抽象类 |
PHPhotoLibrary | PHPhotoLibrary对象表示用户的照片库整套资源和收藏的照片,包括存储在本地装备上在iCloud的照片对象。 |
PhotosTypes | 与Photos框架相干的类型的枚举 |
获得相册列表可以需要用到1下类:
下面是获得相册列表的代码片断:
//MARK: 属性列表
//全部相册的数组
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() {
//创建1个PHFetchOptions对象检索照片
let options = PHFetchOptions()
//通过创建时间来检索
options.sortDescriptors = [NSSortDescriptor.init(key: photoCreationDate, ascending: false)]
//通过数据类型来检索,这里为只检索照片
options.predicate = NSPredicate.init(format: "mediaType in %@", [PHAssetMediaType.image.rawValue])
//通过检索条件检索出符合检索条件的所有数据,也就是所有的照片
let allResult = PHAsset.fetchAssets(with: options)
//获得用户创建的相册
let userResult = PHAssetCollection.fetchTopLevelUserCollections(with: nil)
//获得智能相册
let smartResult = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: nil)
//将获得的相册加入到相册的数组中
photoAlbums.append([WCLImagePickerBundle.localizedString(key: "全部照片"): allResult])
userResult.enumerateObjects(options: .concurrent) { (collection, index, stop) in
let assetcollection = collection as! PHAssetCollection
//通过检索条件从assetcollection中检索出结果
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中检索出结果
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
,需要用到的类:
下面是代码片断:
/**
根据PHAsset获得photo
- parameter ablumIndex: 相册的index
- parameter alasset: 相册里图片的PHAsset
- parameter photoSize: 图片的size
- parameter resultHandler: 返回照片的回调
*/
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({
//创建1个图片资源
PHAssetChangeRequest.creationRequestForAsset(from: image)
}, completionHandler: { (flag, error) in
//履行结果回调
})
以上简单的讲授了1下Photos相干知识点和使用方法,更多的可以去官方文档上去查看。用Photos自己写了1个图片选择器,大家有兴趣的可以去看1下,有用的话可以star1下,写不不是很好,有甚么毛病可以指出来~最后谢谢大家的浏览。