UIScrollView嵌套滑動手勢衝突的簡易實現

明確需求

如今有較多的商城類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(主容器)

此處建立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
  • 內部實現思路
    • 1.添加headerView和barView,並保證在最上層
    • 2.添加對應的tableView視圖,並給tableView一個空的頭部視圖
    • 3.在tableView滾動同時改變上層頭視圖frame
    • 4.左右滑動時,切換爲對應tableView作出動畫效果

總體思路如上所述,有思路了代碼就不貼了。若有須要下載demo
若有錯誤之處請指出,謝謝atom

相關文章
相關標籤/搜索