iOS开发进阶 - 基于PhotoKit的图片选择器
来源:互联网 发布:学习linux怎么样 编辑:程序博客网 时间:2024/05/07 12:35
移动端访问不佳,请访问我的个人博客
很早之前就用OC把代码写完了并用在项目中了,一直没时间整理,现在用swift重写一份,并且更加详细的来了解这个Photos框架,下面是我集合苹果官方文档和其他大神的博客写出的一篇关于Photos框架的介绍
老规矩先上效果图和Demo地址:
了解Photos框架
Photos是ios8出的一个新的图片选择框架,取代之前的AssetsLibrary框架,相比较AssetsLibrary框架Photos的用法更加灵活,发现在iOS9中AssetsLibrary已经被弃用了,并且也不支持livePhoto,iOS9上再使用AssetsLibrary框架时还有个严重的问题就是图片分辨率会变的很低,这篇文章主要讲解一下Photos的简单用法,用它做一个简单的图片选择器。
Photos中各个类的简单解释:
获取相册列表
获取相册列表可以需要用到一下类:
- PHFetchOptions:对象检索的对象,可以对相册列表进行筛选
- PHAssetCollection:图片集合的对象,筛选后获得的集合
下面是获取相册列表的代码片段:
//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() { //创建一个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:对象检索的对象,可以对图片进行筛选
- PHAsset:图片资源的对象,代表一个图片或者视频资源
下面贴代码片段:
/** 通过下标返回相册的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
,需要用到的类:
- PHCachingImageManager:获取图片数据的Manager,也可缓存数据
- PHImageRequestOptions:获取图片的一些选项配置,比如获取方式等等
- 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) } }) } }
将图片存入相册
有时候我们需要将应用里的图片存到相册里面,一下是会用到的类:
- PHPhotoLibrary:代表我们手机中的图片库,用它来操作图片库中的图片
- PHAssetChangeRequest:资源操作的请求类,用来对资源进行操作
代码片段:
//执行变化PHPhotoLibrary.shared().performChanges({ //创建一个图片资源 PHAssetChangeRequest.creationRequestForAsset(from: image) }, completionHandler: { (flag, error) in //执行结果回调 })
总结
以上简单的讲解了一下Photos相关知识点和使用方法,更多的可以去官方文档上去查看。用Photos自己写了一个图片选择器,大家有兴趣的可以去看一下,有用的话可以star一下,写不不是很好,有什么错误可以指出来~最后谢谢大家的阅读。
1 0
- iOS开发进阶 - 基于PhotoKit的图片选择器
- 带大图显示的图片选择器&自定义相机(选中的自动前移)-----》PhotoKit
- iOS开发 图片选择器、图片多选功能的实现
- iOS PhotoKit
- PhotoKit--iOS 开发之照片框架详解
- iOS 开发之照片框架详解PhotoKit,ALAssetsLibrary
- iOS开发获取系统相册资源,自定义相册(PhotoKit)
- iOS:基于Photos框架的图片选择器以及创建自定义相册
- iOS PhotoKit框架 详解
- iOS--PhotoKit简单入门
- iOS PhotoKit 教程
- Android 图片选择器 进阶版
- IOS开发笔记 - 基于SDWebImage的网络图片加载处理
- IOS开发笔记 - 基于SDWebImage的网络图片加载处理
- iOS开发005 OpenCV--基于模板图片的标记识别
- IOS开发笔记 - 基于SDWebImage的网络图片加载处理
- 一个iOS图片选择器的DEMO
- iOS中添加图片选择器的实现
- eclipse配置tomcat完成后,访问http://localhost:8080出现404错误
- javascript中数组里对象的去重
- 微信小程序传递参数方法?
- IOS ViewController跳转大全
- 提高组模拟试题七第二试 佐佐小次郎
- iOS开发进阶 - 基于PhotoKit的图片选择器
- 394. Decode String
- Unity横版动作手游《王者之剑2》性能数据精讲
- viewpager刷新问题
- Linux下C库学习 - float.h
- 如何在java中调用exe
- resultCode的一个常识
- 网络安全基础(1)
- maven 提取jar 文件到当前目录