美文网首页
iOS 手动实现简单的仿tableview

iOS 手动实现简单的仿tableview

作者: 猫粮_fy | 来源:发表于2017-01-01 20:02 被阅读119次

     在iOS 中我们经常和tableview打交道,这几天突然想自己去模仿tableview机制来实现一个仿tableview,虽然代码最后没有什么用,但是体验了一次思考到实践的过程。

    tableviewcell的复用机制是:创建cell时给这个cell一个id,这个携带有id的cell会被放入缓存,然后再cell滚动的时候,离开显示区域的cell会被回收,新滚动出现的界面会从缓存区获取cell,如果没有则创建新的cell。

ok,那我们开始分析,tableview如何做到复用cell,cell的一个id是怎么被使用的。tableview的一个方法是,dequeueReusableCellWithIdentifier:,这个是从缓存获取可复用的cell,那么tableview就含有一个存储可复用cell的属性(暂时定为cacheCells)。cell的初始化方法initWithStyle:reuseIdentifier:这个方法是给cell设定id的,那么,cell中也有一个属性是id。tableview根据这个id来获取cell,那么cacheCells就是一个字典。

知道cell的缓存,那如何能做到,回收cell呢?ok,继续分析。cell在离开界面时,cell被回收。那么这个时候就是检测cell的frame是否是在scrollview内部。用CGRectContainsRect(rect1,cell.frame);来确定,如果在外部,就回收。

那么如何获取cel放到scrollview中?当然也是根据cell的frame来对比,是否在scrollview的显示区域内,如果是就加入到scrollview中,但是有一点,cell还没创建怎么会有frame?这个时候代理的好处就显现出来了,tableview的代理中有获取高度和总数的方法,通过高度计算出cell的frame很简单,把所有frame都存储起来,在试图滚动的时候,我们将frame提取出来做对比,如果在视图显示区域,我们就调用代理获取cell,而在代理中就有实现复用的方法。

ok,贴代码

https://github.com/dadademao/FYTableview

新修改

在cell多时,之前的代码发生了异常情况,cell会被异常回收,检查代码时发现我一直在回收视图展示的cell,用dictionary导致覆盖了之前缓存区的cell,cell数量会越来越少,所以及时做修正,将dictionary改成Set,来保证cell不被无缘无故覆盖掉。

相关文章

网友评论

      本文标题:iOS 手动实现简单的仿tableview

      本文链接:https://www.haomeiwen.com/subject/xxwcettx.html