一、案例演示
IOS中提供的UITableView功能非常强大,section提供分组,cell提供显示,几乎可以应付绝大部分场景。最近想模仿旧版的淘宝的商品详情页(最新的淘宝详情页商品详情和图文详情是两个页面)写一个Demo,后来发现单纯使用UITableView来布局是比较困难的。因为旧版的淘宝详情页中,最外层的View肯定是一个UITableView,但是内层的Tab中,图文介绍、商品详情和评价三个Tab对应的内容非常丰富,如果你把这三块内容放在一个section中的话,将导致数据组织非常困难,并且UI的灵活度也大大降低。所以最后准备尝试使用UITableView嵌套UITableView的方式来组织UI,最外层是一个UITableView,三个Tab其实是一个横向ScrollView,这个ScrollView里面包含三个UITableView。并且Tab中的内容采用动态可配置话的方式生成(下面详解)。实现的效果如下:
二、项目详解
2.1、大体思路
使内层的UITableView(TAB栏里面)和外层的UITableView同时响应用户的手势滑动事件。当用户从页面顶端从下往上滑动到TAB栏的过程中,使外层的UITableView跟随用户手势滑动,内层的UITableView不跟随手势滑动。当用户继续往上滑动的时候,让外层的UITableView不跟随手势滑动,让内层的UITableView跟随手势滑动。反之从下往上滑动也一样。
如上图所示,外层的section0为价格区,可以自定义。section1为sku区,也可以自定义。section2为TAB区域,该区域采用Runtime反射机制,动态配置完成。
2.2、具体实现
2.2.1、YXIgnoreHeaderTouchTableView
我们顶部的图片其实是覆盖在外层UITableView的tableHeaderView的下面,我们把tableHeaderView设置为透明。这样实现是为了方便我们在滑动的时候,动态的改变图片的宽高,实现列表头部能够动态拉伸的效果。但是我们对于UITableView不做处理的时候,该图片是无法响应点击事件的,因为被tableHeaderView提前消费了。所以我们要不让tableHeaderView不响应点击事件。我们在YXIgnoreHeaderTouchTableView的实现文件中重写以下方法。
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
if (self.tableHeaderView && CGRectContainsPoint(self.tableHeaderView.frame, point)) {
return NO;
}
return [super pointInside:point withEvent:event];
}
2.2.2、 YXIgnoreHeaderTouchAndRecognizeSimultaneousTableView
该文件继承于YXIgnoreHeaderTouchTableView,除此之外,主要是为了让外层的UITableView能够显示外层UITableView的滑动事件。我们需要实现以下代理方法。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSi