最近项目中用到了滚动视图嵌套滚动视图,此功能做完了,就做个记录。
其实核心思路就是在滑动视图的时候需要主滚动视图和子滚动视图都可以收到滚动事件。然后在指定的位置控制主视图以及子视图是否让其继续滚动即可。
例如本demo中MainTableView实现如下:
MainTableView继承自UITableView,.m实现如下方法,可以让事件传递下去
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
if ([otherGestureRecognizer.view isKindOfClass:[MainScrollView class]]) {
return NO;
}
return YES;
}
然后控制器里边创建MainTableView对象并实现代理,然后就是实现滚动:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor whiteColor];
self.title = @"";
self.canScroll = YES;
[self.view addSubview:self.tableView];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeScrollStatus) name:@"mainCanScroll" object:nil];
}
// 主视图可以滚动的通知
- (void)changeScrollStatus{
self.canScroll = YES;
self.subCell.cellCanScroll = NO;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
CGFloat bottomCellOffset = [self.tableView rectForSection:1].origin.y;
if (scrollView.contentOffset.y >= bottomCellOffset) { // 第二个sectionHeaderView滑动到顶部
scrollView.contentOffset = CGPointMake(0, bottomCellOffset);
self.canScroll = NO;
self.subCell.cellCanScroll = YES;
}else{
if (!self.canScroll) {
scrollView.contentOffset = CGPointMake(0, bottomCellOffset);
}
}
}
子滚动视图实现如下:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
if (_canScroll) {
NSLog(@"😄😄😄😄😄😄😄😄");
}else{
_tableview.contentOffset = CGPointZero;
}
if (_tableview.contentOffset.y < 0) {
_canScroll = NO;
_tableview.contentOffset = CGPointZero;
[[NSNotificationCenter defaultCenter] postNotificationName:@"mainCanScroll" object:nil];//到顶通知父视图改变状态
}
}
根据指定的位置来控制当前滚动主视图还是子视图,可以下载demo具体运行感受一下。