最近遇到一個需求頁面纺非,上下滾動吸頂须蜗,支持列表左右滾動,如圖:
根據(jù)需求铛楣,我寫的頁面布局如下:
簡單描述布局邏輯:最底層使用tableView_1 - 主要是想使用其
section-head
吸頂效果近迁,tableView_1
的tableViewHeadView
是大文字標(biāo)題,tableView_1
的tableViewfootView
為scrollView
簸州,scrollView
添加兩個tableView_2
鉴竭。完成布局,任務(wù)就已完成80%岸浑,現(xiàn)在剩下一個最重要問題要解決:嵌套導(dǎo)致的
tableView
上下滾動沖突問題搏存。相關(guān)代碼如下:
-
外部
tableView_1
,重寫手勢方法助琐,目的是tableView_1
接收在tableView_2
區(qū)域的滾動手勢
HDBaseTableView.h
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface HDBaseTableView : UITableView<UIGestureRecognizerDelegate>
@end
NS_ASSUME_NONNULL_END
HDBaseTableView.m
@implementation HDBaseTableView
/**
同時識別多個手勢
@param gestureRecognizer gestureRecognizer description
@param otherGestureRecognizer otherGestureRecognizer description
@return return value description
*/
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
return YES;
}
@end
-
外
tableView
:tableView_1
不能滾動時祭埂,吸頂;滾動時兵钮,重置tableView_2
偏移量蛆橡。
HDFormViewController.m
@interface HDFormViewController ()<HDFormListViewDelegate, UITableViewDelegate, UIScrollViewDelegate>
/// 外部tableview
@property (nonatomic, strong) HDBaseTableView *formTableView;
/// 是否滾動
@property (nonatomic, assign) BOOL isCanScroll;
@end
#pragma mark - setter、getter
- (HDBaseTableView *)formTableView{
if (!_formTableView) {
_formTableView = [HDBaseTableView new];
_formTableView.bounces = NO;
_formTableView.delegate = self;
_formTableView.showsVerticalScrollIndicator = NO;
_formTableView.showsHorizontalScrollIndicator = NO;
_formTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
if (@available(iOS 11.0, *)) {
_formTableView.estimatedRowHeight = 0;
_formTableView.estimatedSectionHeaderHeight = 0;
_formTableView.estimatedSectionFooterHeight = 0;
_formTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
[_formTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:NSStringFromClass([UITableViewCell class])];
_formTableView.tableHeaderView = self.downloadTipView;
_formTableView.tableFooterView = self.horScrollView;
}
return _formTableView;
}
#pragma mark - UIScrollViewDelegate
static CGFloat const headerHeight = 105;
static CGFloat const kCanHideHeaderHeight = 93;
static CGFloat const kHeaderHeight = 105;
static CGFloat const kCanHideHeaderHeight = 93;
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
if (scrollView == self.formTableView) {
self.titleLabel.hidden = !(self.formTableView.contentOffset.y > 45);
// 外tableview滾動max-offsetY
if (scrollView.contentOffset.y >= kCanHideHeaderHeight) {
// 上劃吸頂
scrollView.contentOffset = CGPointMake(0, kCanHideHeaderHeight);
if (_isCanScroll) {
// 禁止?jié)L動
_isCanScroll = NO;
}
}else{
if (!_isCanScroll) {// 外tableView不能滾動時掘譬,需要保持吸頂狀態(tài)
scrollView.contentOffset = CGPointMake(0, kCanHideHeaderHeight);
}else{// 外tableView滾動時泰演,內(nèi)tableView不能滾動
self.formListView.listTableView.contentOffset = CGPointZero;
}
}
}
}
#pragma mark - NSNotification
- (void)addNotification{
_isCanScroll = YES;
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(changeScrollStatus) name:kHDChangeScrollStatus object:nil];
}
- (void)changeScrollStatus{
_isCanScroll = YES;
// 非0保證下拉刷新
if (self.formTableView.contentOffset.y != 0) {
self.formListView.listTableView.contentOffset = CGPointZero;
}
}
- (void)dealloc{
[[NSNotificationCenter defaultCenter]removeObserver:self name:kHDChangeScrollStatus object:nil];
}
-
tableView_2
:不能滾動時,通知tableView_1
滾動葱轩,重置tableView_2
偏移量睦焕。
HDFormListView.m
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
//到頂通知父視圖改變狀態(tài)
if (scrollView.contentOffset.y <= 0) {
[[NSNotificationCenter defaultCenter] postNotificationName:kHDChangeScrollStatus object:nil];
}
}