服务器之家

服务器之家 > 正文

iOS实现微信/QQ显示最近拍摄图片的功能实例代码

时间:2021-03-10 16:28     来源/作者:brycegao321

 如果你刚刚拍摄图片,在使用微信/qq发生消息时会显示“你可能要发送的图片”,

iOS实现微信/QQ显示最近拍摄图片的功能实例代码

实现原理:

1、打开或重新进入聊天窗口时查询图库最新的照片, 对比拍照时间和当前时间的差,当低于阈值(例如一分钟)时就显示出来。 ps:阈值是逻辑上判断是否最近的依据。优点:总能找到最近拍摄的图片; 缺点:每次都要查询图片数据,响应较慢。

2、注册图库变化监听(观察者模式), 响应图库的增删改事件, 拿到变化图片数据后做对应的逻辑。 优点: 实时响应; 缺点:影响性能, 在注册监听前拿不到变化数据。

实现方式:

1、在info.plist文件中添加访问相机数据的权限。

iOS实现微信/QQ显示最近拍摄图片的功能实例代码

2、在启动应用后要获取相机权限, 调用phphotolibrary.requestauthoriztion方法,提示内容是plist对应相机权限字段内容(ps:跟android的动态权限获取是一个套路)。

3、获取相机权限后,要缓存所有phasset类型的照片记录(不包含图片二进制数据,所有不用担心内存溢出); 缓存所有图片记录是为了后续比较变化使用, 逻辑上是变化前数据。

4、观察者模式的register, 注意在适当的地方要执行unregisterchangeobserver。

5、在回调函数photolibrarydidchange里做图库变化后的逻辑, 这里的phchange类可以跟前面缓存的变化前数据比较并得到变化的部分(包括新增、删除、修改,厉害了; android没有这么方便的api。。。)。

6、使用dispatchqueue.main.async是主线程异步执行, 作用同android主线程handler的sendmessage。这是观察者模式的标准做法,避免阻塞通知队列。

7、使用phcachingimagemanager取出phasset的图片数据imageview对象。

8、显示到ui里。

参考代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import uikit
import photos //使用图库功能时必须引用这个包
//显示最近拍摄的照片为缩略图
class viewcontroller: uiviewcontroller, phphotolibrarychangeobserver {
 var assetsfetchresults:phfetchresult<phasset>!
 var imagemanager: phcachingimagemanager! //带缓存的图片管理对象
 var imageview: uiimageview! //用于显示缩略图
 var assetgridthumbnailsize: cgsize! //缩略图大小
 override func viewdidload() {
  super.viewdidload()
  // do any additional setup after loading the view, typically from a nib.
  imageview = uiimageview()
  imageview.frame = cgrect(x: 50, y: 50, width: 100, height: 100)
  imageview.contentmode = .scaleaspectfit
  imageview.clipstobounds = true
  self.view.addsubview(imageview)
  self.imagemanager = phcachingimagemanager() //初始化和充值缓存
  let scale = uiscreen.main.scale //像素比
  assetgridthumbnailsize = cgsize(width: imageview.frame.width*scale,
          height: imageview.frame.height*scale)
  //申请权限
  phphotolibrary.requestauthorization({ (status) in
   if status != .authorized {
    return
   }
   //获取所有图片资源(按照创建时间排序)
   let allphotooptions = phfetchoptions()
   allphotooptions.sortdescriptors = [nssortdescriptor(key: "creationdate",
                ascending: false)] //排序方式
   allphotooptions.predicate = nspredicate(format: "mediatype = %d",
             phassetmediatype.image.rawvalue) //类型
   self.assetsfetchresults = phasset.fetchassets(with: .image,
               options: allphotooptions) //查询照片类型
   var i = 0
   while i<self.assetsfetchresults.count {
    let asset = self.assetsfetchresults[i]
    print(" 创建时间:\(asset.creationdate?.description)") //打印所有图片的创建时间
    i += 1
   }
   if (self.assetsfetchresults.count > 0) {
    //显示最近一张拍摄的图片(也可以根据拍摄时间远近决定是否要显示)
    self.imagemanager.requestimage(for: self.assetsfetchresults[0],  //最近一张图片
            targetsize: self.assetgridthumbnailsize,
            contentmode: .aspectfill,
            options: nil, resulthandler: { (image, info) in
            self.imageview.image = image //取出图像并显示出来
    })
   }
   print("图片数量:\(self.assetsfetchresults?.count)")
   //注册监听资源变化
   phphotolibrary.shared().register(self) //删除是unregisterchangeobserver
  })
 }
 override func didreceivememorywarning() {
  super.didreceivememorywarning()
  // dispose of any resources that can be recreated.
 }
 func photolibrarydidchange(_ changeinstance: phchange) {
  guard let changes = changeinstance.changedetails(for: self.assetsfetchresults as! phfetchresult<phobject>) else {
   return
  }
  //异步执行,避免阻塞图片变化事件队列
  dispatchqueue.main.async {
   if let result = changes.fetchresultafterchanges as? phfetchresult<phasset> {
    self.assetsfetchresults = result //差异结果
   }
   //判断是否有新增图片或删除图片的情况
   if !changes.hasincrementalchanges || changes.hasmoves {
    return
   } else {
    print("图片数据有变化")
    if let indexs = changes.changedindexes, indexs.count>0 { //不显示0的情况
     print("有\(indexs.count)张图片发生变化")
    }
    if let removes = changes.removedindexes, removes.count>0 {
     print("删除了\(removes.count)张图片")
    }
    if let inserts = changes.insertedindexes, inserts.count>0 {
     //有新增图片
     print("新增了\(inserts.count)张图片")
     let picture = self.assetsfetchresults[inserts.first!]
     self.imagemanager.requestimage(for: picture,
             targetsize: self.assetgridthumbnailsize,
             contentmode: .aspectfill,
             options: nil, resulthandler: { (image, option) in
             self.imageview.image = image //取出图像并显示出来
     })
    }
   }
  }
 }
}

以上所述是小编给大家介绍的ios实现微信/qq显示最近拍摄图片的功能实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:http://blog.csdn.net/brycegao321/article/details/64917765

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部

909
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40