UITableView 非常强大,但只能竖向滚动;UICollectionView 可以解决各种布局难题,但稍微有些复杂。对于一些简单的需求,有点杀鸡用牛刀的感觉。
在 iOS6 之前,还没有 UICollectionView,为了实现横向滚动的 UITableView,只有自己动手写组件。为了达到和 UITableView 差不多的效果,就得先弄清其内部实现机制是怎么回事。
在渲染 View 的时候,会耗费系统资源。如果创建大量的 View,系统的运行将变得异常缓慢,甚至导致内存耗尽。但是在实际应用中,我们可能会遇到大量需要显示的数据。如果我们每显示一个数据都创建一个 View,那么应用程序的体验将会非常糟糕。所以 Apple 为 iOS 开发者提供了 UITableView,Google 为 Android 开发者提供了 ListView。
简单来说,UITableView 采用复用机制,它只显示其可见区域内的 UITableViewCell。我们在滑动的过程中,当超出 UITableView 可见区域的 Cell 会从 UITableView 中移除,并加入到回收池中以供复用。当 UITableView 需要显示新的 Cell 时,会先从回收池中查找是否有可以重用的 Cell(通过 dequeueReusableCellWithIdentifier:)。如果有,则直接将其重新显示;如果没有,则会创建新的 Cell。这样一来,就可以避免因创建过多的 View 导致内存耗尽的情况。
了解了其内部运行原理,我们也可以实现自己的 UITableView。
一个非常常见的使用场景——显示图片:如果显示一张图片,用一个 UIImageView 就足够了。如果要显示多张图片,并且它们可以左右滚动,最简单的方法是使用一个 UIScrollView 包含多个 UIImageView,但这样一来可能带来的结果就是,如果数据量很大,该程序可能根本无法使用。如果还需要实现无限循环滚动,这个解决方案肯定不行。所以在这种情况下,我们需要自己实现一个 UITableView。
最初,我编写了一个名为 KIFlowView 的组件,实现了上述需求,但这些都是 iOS5 时代的产物,难免过于陈旧。在后续的工作中我也发现,类似的需求其实挺多的,比如左右滑动的 View,比如网易新闻客户端,可以左右滑动,在不同的新闻栏目之间切换;有时我们也需要实现一些 Tab,如果 Tab 的项目比较多,也需要考虑复用的问题,所以决定重新编写一个增强组件作为其替代品,因此就产生了 KIPageView。
Pods
pod 'KIPageView'