最近比较流行的布局就是页面有个tab页下面是一个或者几个tableView可以左右滑动,tab页滑到顶部置顶悬浮。
思路:一个scrollView镶嵌一个scrollView中利用代理监听他们的偏移量,设置一个临界值,没过这个值主scrollView可以滑动,子scrollView不可以滑动,当超过这个值,主scollView不可以滑动,子scollView可以滑动。
首先创建两个scrollView,MainScrollView和ContentScrollView都继承于UIScrollView。
MainScrollView.m文件:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
支持多手势
ContentScollView里面可以添加一个或者多个UITableView
1、在控制器中设置topViewHeight(topView的高度)和floatHeight(悬浮的高度),设置主子scrollView是否可以滑动
self.topViewHeight = 300;
self.floatHeight = 200;
self.canMove = YES;
self.contentCanMove = NO;
2、懒加载MainScrollView和ContentScollView
- (MainScrollView *)mainScrollView
{
if (!_mainScrollView)
{
CGFloat height = kScreenHeight - 44 - [UIDevice statusBarHeight] - [UIDevice tabBarHeight];
_mainScrollView = [[MainScrollView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, height)];
_mainScrollView.delegate = self;
_mainScrollView.contentSize = CGSizeMake(0, height + self.topViewHeight);
if (@available(iOS 11.0, *))
{
_mainScrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
}
return _mainScrollView;
}
- (ContentScrollView *)contentScrollView
{
if (!_contentScrollView)
{
CGFloat height = kScreenHeight - 44 - [UIDevice statusBarHeight] - [UIDevice tabBarHeight];
_contentScrollView = [[ContentScrollView alloc] initWithFrame: CGRectMake(0, self.topViewHeight, kScreenWidth, height - self.floatHeight)];
_contentScrollView.tableView.delegate = self;
_contentScrollView.tableView.dataSource = self;
}
return _contentScrollView;
}
3、设置代理
#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (scrollView == self.mainScrollView)
{
CGFloat contentOffsetY = scrollView.contentOffset.y;
CGFloat maxOffsetY = self.topViewHeight - self.floatHeight;
if (contentOffsetY >= maxOffsetY)
{
self.contentCanMove = YES;
self.canMove = NO; // 自己不能滑动了
}
if (!self.canMove)
{
[scrollView setContentOffset:CGPointMake(0, maxOffsetY)];
}
}
else if ([scrollView isKindOfClass:UITableView.class])
{
CGFloat offsetY = scrollView.contentOffset.y;
if (offsetY <= 0)
{
self.canMove = YES;
self.contentCanMove = NO;
}
if (!self.contentCanMove)
{
[scrollView setContentOffset:CGPointMake(0, 0)];
}
}
}