如今有较多的商城类app有以下需求,界面上带有headerView,而且有一个barView可悬停,最下方为多个可左右滑动的tableView,具体可参考下图git
在网上关于此类需求的实现较多,大多数为使用UIScrollView手势穿透(多个视图响应一个手势)来达到效果。
此前笔者也是用相似方法实现,最近想到了另外一种实现方案(实现和学习成本很低)。github
经过界面层次就很容易明白笔者的思路了,在界面上只有一个tableView存在,同时在tableView之上还有一个HeaderView(包含广告和按钮位),当使用手势滑动时,再作动画切换对应的tableView视图(此种方式没有复用效果,固然若是有追求极致者也可去实现),HeaderView保持不变。当tableView滑动的同时,改变HeaderView坐标,这样就能够保证手势丝滑,不存在任何卡顿。app
遵循此协议的UIViewController均可以成为界面上的tableView。自定义的tableView只须要关心标示符便可学习
@protocol SwipTableViewDelegate <NSObject> @property (nonatomic, strong) UITableView * tableView; @property (nonatomic, copy) NSString * itemTitle; ///< 子视图标示符,也可用其余类型代替 @property (nonatomic, assign) CGFloat headerHeight; ///< 头部视图高度(包含广告位和按钮位) @property (nonatomic, assign) BOOL needScrollBlock; ///< 滑动时是否须要回调 /* 更新数据源方法 */ - (void)reloadWithDatas:(NSArray *)datas; /* 当tableView上下滑动时需回调此方法中的block */ - (void)scrollViewDidScrollBlock:(void(^)(CGFloat offsetY))block; @end
此处建立SwipeSubTableVc,自定义headerView和barView,传入本身配置的UIViewController(需遵照SwipTableViewDelegate协议)动画
@interface SwipeSubTableVc : UIViewController @property (nonatomic, strong) UIView * headerView; @property (nonatomic, strong) UIView * barView; @property (nonatomic, strong) NSArray<UIViewController<SwipTableViewDelegate> *> * tabArrs; - (void)resetTabArrs:(NSArray<UIViewController<SwipTableViewDelegate> *> *)tabArrs; - (void)switchToTabVc:(NSInteger)index; - (void)tabVcWillSwitchToIndex:(void(^)(NSInteger index))changeBlock; @end
总体思路如上所述,有思路了代码就不贴了。若有须要下载demo
若有错误之处请指出,谢谢atom