前言

平等年前以 UITableView 无法满足急需,我实现了近似 UITableView
的组件, DLTableView

为此实现一个自定义的 UITableView,是坐自用一个克最好循环滚动的
TableView。

一般而言的做法是安 dataSource 的 numberOfRowsInSection:
方法返回尽量多之行数,然后在针对 row
取余为落实看起是绝循环滚动的特效。UIDatePicker 就是这样子实现的。

这种方案有只问题,如果用户一直朝着下滚动,还是能滚动到底的,所以行数要装的尽量生。另一方面太怪的行数会促成内存以暴涨。
UIDatePicker 的做法是设置一个靠边的行数,在用户已滚动的早晚去校正
contentOffset,由于没有动画效果,用户无法感知,在内存和力量之间赢得了平衡。但是接连朝下滚动的说话,你见面发觉或能够滚到底层,等您更入的当儿才会重置一下
contentOffset。所以这方案并无周全。

因为过剩缘由最终我说了算实现一个 UITableView。好处来几只:

  1. 起实施备受想苹果是怎样促成的,有啊困难,它的 UITabeleView
    有啊可以改进的处在。这些不是不过的看几乎首博客或者直接看源码就得收获的
  2. 落实一个着力的 TableView 之后,可以添加诸多原生 TableView
    不有的效用,比如说循环滚动特性。项目执行可以更灵活
  3. 足根据新的自定义的 TableView 实现一个比官方
    UIPickerView/UIDatePicker 更好的 DLPickerView

这里先主一下,下一样篇我会讲解如何根据 DLTableView 实现
DLPickerView。这个 pickerView 有瞬间特色:

  1. 类似 UITableView 的 delegate 和 dataSource,同时可从定义
    cell,用法了类似 UITableView,灵活性更强。
  2. 得安装连续的可选区域,用户不可知滚动到可卜区域外
  3. 可以安排循环滚动或者未循环滚动
  4. DLPickerViewDelegate 提供针对性每个 cell 基于即岗位的视图自定义

DLTableView
的 GitHub 地址是
https://github.com/danleechina/DLTableView。

下开始讲话怎么兑现一个自定义的 TableView。

关键点

从今定义 TableView 的落实有三三两两个重点点:

  1. Cell 复用
  2. 找到实现之切入点

Cell 复用比较好明,因为内存是鲜的,不可能无限多之生成 Cell 实例。

Cell 复用的兑现呢比较简单,给每种 Cell 类设置一个
identifier,以这个吧键,值为一个分包该 Cell 类的 set 集合。Cell
滚来可视域时候加到 set 里面,Cell 出现在可视域时打 set
里面得到一个,如果 set 里面没有底说话则甚成一个。

那切入点呢?

第一,我们的自定义 DLTableView 是基于 UIScrollView
的,UIScrollView
提供了那个好之轮转效应,虽然当用的时节发现尚是发出硌不顶惬意的地方,比如为卡通的主意设置
contentOffset
时没法完成设置一个完了动画的回调,还有即使是像对滚动的绊脚石做调整。

今请想想一个问题,在什么时间为 DLTableView 添加一个 Cell,也就是说将
Cell 作为 TableView 的子视图或者后人视图?以及当 Cell
从用户视线中冲消时以 Cell 从 DLTableView
中移除,并在到复用的队列中?

先是想到的凡 scrollViewDidScroll:,在 UIScrollView 滚动的早晚添加
Cell。但是 scrollViewDidScroll 是代理实现之,作为后续自 UIScrollView
DLTableView 本身不该实现此代理。而且以 contentSize 未知之时段
UIScrollView 可能从来不能够滚动。

本来我们得 hook 掉 UIScrollViewsetDelegate: 方法,然后于起定义
TableView 里面实现所有 UIScrollViewDelegate
的章程,在这些主意中又回调给使用从定义 TableView 的 delegate。天猫的
LazyScrollView
就是这般实现之 (不过它独自复写了 scrollViewDidScroll:
方法,其他方是通过动态转发来兑现的)。这种方案的老毛病是若手动设置
contentSize

自身当下边的落实是运 layoutSubviews。每次初始化的时刻,UIView
都见面调用该措施,在是方法中我们可初始化最初的可见 Cell,以及
contentSize。灵感源于同苹果之合法
demo:StreetScroller

另外,当 UIScrollView
滚动的时段,会反复的调用该办法。这样咱们即便得动态的以 Cell 加入或者去丢。

此处补充某些,有时候 scrollViewDidScroll:
的调用频率没我们纪念的那多的下,你啊得兑现
layoutSubviewslayoutSubviews 的频率比 scrollViewDidScroll:
高,当然绝不忘记调用 [super layoutSubviews]

贯彻细节

  1. TableView 可能会见发 header 或者 footer,所以在算高度的时每个 cell
    的职使添加 header 高度的摇,计算 contentSize
    的莫大的时候如果长 footer 的可观。
  2. TableView 可以无一味发生 row 还足以更加区分每个
    section,关键一点凡是每个 section 也堪生 header 和 footer,所以测算
    cell 的职务的时候会生出那一些休直观,同时 section 的 header 和
    footer 在 TableView 中之岗位是滚的,到到的时光还要是悬浮在 row
    上面,这同点而留意。
  3. UITableView 支持以有 Cell 滚动到顶部,自定义之时节可考虑将 Cell
    滚到到、中、底。
  4. 点击。一般不见面在每个 Cell 里面加一个 tap gesture
    recognizer。我的做法是以 TableView 层面加一个 Tap gesture
    recognizer,这样每次识别到点击的时节,可以切实分配到某某
    cell。当然还有设置点击效果(比如 cell 点击变灰)。

DLTableView

本人顿时边贯彻了一个自定义 TabelView,DLTableView

目前 DLTableView 实现之性状有:

  1. 类似 UITableViewDataSource
    DLTableViewDataSource,使用者可以兑现 dataSource
    来自定义行数和各个一行的 cell
  2. 类似 UITableViewDelegate
    DLTableViewDelegate,目前包含点击逻辑、自定义高度和某某 Cell
    滚来可看到区域时段的回调
  3. 得循环滚动,同时内存以无见面冒出暴涨(比如 UITableView
    就见面膨胀)
  4. 点击某一样推行可滚动到到、中、底

君得将 DLTableView 看做是一个简化版的 UITableView,它从未
section,只有 row,也未曾实现每个行的分割线,更没有兑现 UITableView
里面的左滑 cell 自定义菜单这些力量,而且目前还未支持活动测算行高。

可是是因为 DLTableView
的实现是开源可见的,所以你可以依据这开更的自定义。

更好的 TableView

上面说了那么基本上,都是于出口什么贯彻一个接近 UITableView
TableView,主要是寨子。

这就是说如何根据山寨版的 TableView,提供一个还好之 TableView ?

率先什么叫更好的 TableView ?我整了之类:

  1. 自动计算和缓存 Cell 高度,市面上发出无数息息相关开源代码,你可以查阅。
  2. 异步构建视图,以及加载数据,参考 AsyncDisplayKit(Texture) 的思想。

引用

  1. StreetScroller
  2. iOS 异构滚动视图 LazyScrollView
    一些兑现细节之深入解读
  3. LazyScrollView

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图