如今有較多的商城類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