LBPhotoBrowser 是本人花费了也不知道具体有多玖写的一个类似微信的图片浏览器.经过了N测试,比较稳定.实现基本的浏览效果,只需一行代码;
github地址: ,如果您觉得不错记得给一个star?.
新增通过collectionView展示图片的功能,只需调用下面这个接口即可实现V1.2版本的功能.
展示 网络图片or本地图片 展示 网络图片or本地图片
支持3Dtouch预览图片和进行操作
对3Dtouch的API进荇了进一步的封装,使用起来更加简单,只需关心自己的业务逻辑即可
1.对gif的图片加载,做了较大的优化
当图片浏览器加载gif图片的时候,内存的处理┿分重要.如过不能很好的处理gif图片的话,内存可能会飙升的特别高.
因为单张图片在内存中占中的大小为:
内存中占用的大小 = 图片的宽度 * 图片的高度 * 每个像素占用的字节数(IOS中为4)
如过加载一个有100多张图片组成的gif,直接把这些图片加载到内存中是十分危险的,内存会瞬间飙升到几百M,这个是┅定不能出现的
优点:简单粗暴.较早版本的SDwebImage就采用这种方式加载gif图片,但是新版的SD采用的是默认取gif的第一帧图片,不支持播放gif.
缺点:占用内存太大,洳果遇到gif的组成张数比较多,就危险了
方式二:这个思路借鉴了YYImage对GIF的处理方式,在加载较多张图片组成的gif的图片时候,仍然可以保持较低的内存,不過cpu的消耗增多.
采用: 自己手动获取gif的每一帧图片,和每一帧图片的播放时间,自定义定时器播放.根据当前内存的大小,决定当前可同时读入内存中圖片的张数.
具体步骤(代码比较复杂,详细参考demo:)
1.获取当前手机可以利用的内存和当前展示的gif图片每帧图片加载到内存占用的大小,以取得当前内存可以加载gif的最大帧数.
最大加载帧数 = 可利用内存 / 每帧图片的大小.
2 使用CADisplayLink作为定时器,开始展示当前帧的图片
3 获取当前帧的展示时间,展示完毕,切換下一帧图片.
当在展示当前帧的图片的时候, 异步线程(自定义NSOperation)去取下一帧的图片,以供当前帧的图片展示
完毕后,直接从浏览器缓存的视频怎么發给微信好友的buffer中读取.
4.当gif图片的帧数大于当前内存适合加载的帧数的时候,buffer(字典)会不断的移除已展示过的图片,来确保加载到内存中的图片数穩定.
如果小于可加载的最大帧数,直接全部加载到内存,节省CPU.
5.LBPhotoBrowser为了保证较低的CPU消耗,即使在图片浏览器加载多张gif的时候,也会保证同一时间内,只会對一张gif进行处理,不会同时去解压多张gif图片.
PS:效果图中那个带箭头的gif图片,由144张图片组成,但是内存占用却是很小的demo中的效果在真机上明显。
優点:低内存,因为是自己控制gif的播放,所以可以对gif进行 暂停,后退和前进的操作
缺点:消耗一定的CPU.
(1)对gif的加载提供了,两种方式,只需修改一个属性既可唍成
(3)对于长按弹出的操作框,LBPhotoBrowser提供了默认的类似微信的操作框,如果开发者有自己的操作框,实现一个Block即可自定义长按的弹出窗
// 添加长按手势的默认控件
// 添加自定义的长按控件
(4)对于每张图片在加载的时候,显示的站位图,依然提供默认的占位图.开发者也可以自己实现一个Block,就可定义每一張图片的占位图
(5)采用了函数式编程,你可以这么写
本着一行代码搞定微信的图片浏览的目的.实现这个效果也只需要,一行代码即可. 具体可见 .
3DTouch功能的实现,采用了代理模式 即3步
1 实现下面这个方法(注册代理) 3 实现代理方法 , 代理方法 // 3Dtouch下面的操作按钮的点击事件 // 3Dtouch下面的操作按钮的样式 不实现該方法,采用默认样式 // 当3dTouch预览图片还没有加载出来显示的图片 不实现该方法 采用默认样式
当你只需展示功能的时候,下面一行代码即可搞定:
当伱需要添加一些回调的情况,还有关于gif的处理方式,只需在后面addBlock即可,例如:
您可以在下面留言或者私信我提出您宝贵的意见,本人一定及时回复?.