,如果你刚刚拍摄了图片,在使用微信/QQ发生消息时会显示”你可能要发送的图片”,
1,打开或重新进入聊天窗口时查询图库最新的照片,对比拍照时间和当前时间的差,当低于阈值(例如一分钟)时就显示出来。PS:阈值是逻辑上判断是否最近的依据。优点:总能找到最近拍摄的图片;缺点:每次都要查询图片数据,响应较慢。
2,注册图库变化监听(观察者模式),响应图库的增删改事件,拿到变化图片数据后做对应的逻辑。优点:实时响应;缺点:影响性能,在注册监听前拿不到变化数据。
1,在info.plist文件中添加访问相机数据的权限。
2,在启动应用后要获取相机权限,调用PHPhotoLibrary.requestAuthoriztion方法,提示内容是plist对应相机权限字段内容(PS:跟安卓的动态权限获取是一个套路)。
3,获取相机权限后,要缓存所有PHAsset类型的照片记录(不包含图片二进制数据,所有不用担心内存溢出);缓存所有图片记录是为了后续比较变化使用,逻辑上是变化前数据。
4,观察者模式的注册,注意在适当的地方要执行unregisterChangeObserver。
5,在回调函数photoLibraryDidChange里做图库变化后的逻辑,这里的PHChange类可以跟前面缓存的变化前数据比较并得到变化的部分(包括新增、删除,修改,厉害了,安卓没有这么方便的API…)。
6,使用DispatchQueue.main。异步是主线程异步执行,作用同Android主线程处理程序的sendMessage。这是观察者模式的标准做法,避免阻塞通知队列。
7、使用PHCachingImageManager取出PHAsset的图片数据ImageView对象。
8,显示到UI里。
进口UIKit//导入照片使用图库功能时必须引用这个包//显示最近拍摄的照片为缩略图 类ViewController: ui, PHPhotoLibraryChangeObserver { var assetsFetchResults: PHFetchResult! var imageManager: PHCachingImageManager !//带缓存的图片管理对象 var imageView: UIImageView !//用于显示缩略图 var assetGridThumbnailSize: CGSize !//缩略图大小 覆盖func viewDidLoad () { super.viewDidLoad ()//做任何额外的设置加载视图后,通常从笔尖。 imageView=UIImageView () imageView.frame=CGRect中(x: 50 y: 50,宽度:100年,身高:100) imageView。内容模式=.scaleAspectFit imageView。clipsToBounds=true self.view.addSubview (imageView) 自我。imageManager=PHCachingImageManager()//初始化和充值缓存 让规模=UIScreen.main。规模//像素比 assetGridThumbnailSize=CGSize(宽度:imageView.frame.width *规模, 高度:imageView.frame.height *规模)//申请权限 PHPhotoLibrary。requestAuthorization({(状态) 如果状态!=.authorized { 返回 }//获取所有图片资源(按照创建时间排序) 让allPhotoOptions=PHFetchOptions () allPhotoOptions。sortDescriptors=[NSSortDescriptor(关键:“创建日期”, 提升:false)]//排序方式 allPhotoOptions。谓语=NSPredicate(格式:“mediaType=% d”, PHAssetMediaType.image.rawValue)//类型 自我。assetsFetchResults=PHAsset。fetchAssets (: .image, 选项:allPhotoOptions)//查询照片类型 var i=0 虽然i iOS实现微信/QQ显示最近拍摄图片的功能实例代码