文章内容仅供学习交流,如有不妥,请联系我删除:)
用到的工具:Reveal,Charles,Hopper,越狱设备
流畅的列表滑动可以很大的提升用户体验,尽量减少程序控制的透明色(GPU发现某层是不透明的,就不会计算它下面的层来显示了)和阴影都能提升UITableView滑动的流畅性。实时计算的圆角(CALayer的cornerRadius)也会加重GPU的运算,可是我们的程序经常会遇到需要用圆角的情况,所以如何高效的进行圆角显示就变得非常重要。
Stack Overflow上也有一些优化的方案,比如让设计师提供带圆角,内部是透明色的图片;或者直接在服务器生成圆角图片等等。第一种方案不”优雅”,并且依然有透明色,第二种方案太死板,并且需服务端的支持。
看到微信的聊天列表页也有头像是圆角,服务号头像是圆形,通讯录又没有圆角,而且滑动也很流畅,很好奇微信是如何实现的,于是打算使用工具分析一下。
首先在越狱设备上安装微信,将Reveal的framework和dylib分别copy到越狱机的:/System/Library/Frameworks和:/Library/MobileSubstrate/DynamicLibrarie下,重启设备。之后可以看到微信的布局了
通过Reveal我们看到微信头像是通过一个叫MainFrameHeadView展示的,那让我们看一下MainFrameHeadView大概是如何实现的,将微信的二进制文件拖到Hopper中,等待分析完成。
分析完成后,搜索MainFrameHeadView
在这个类的代码段中,发现关键字CHeadImageMgr的getRoundImage:size:conerSize:forSence:方法,看其方法名就大概猜到是其对图片进行了圆角处理、或者是获取经过圆角处理的图片了。继续搜索CHeadImageMgr
看到此类基本就是对头像进行了各种各样的处理。通过Charles抓包,发现圆形头像实际是服务器生成好的
至此,我们大概知道,微信中对话列表的用户头像圆角是本地生成的。原始头像下载好后,很可能立刻进行图片处理,保留不带圆角和带圆角的头像并进行本地持久化。以后圆角头像如果再次用到,就先走内存缓存,内存没有检查本地,本地没有再从网络获取(类似SDWebImage,只不过多了一步下载完成后进行了图片处理)。
本地缓存的圆角图片,跟背景颜色相同的UILabel,再加上不复杂的UI逻辑,你的UITableView也能像微信的对话列表一样流畅。