iOS开发UIScrollView镶嵌一个或者多个UITableView

最近比较流行的布局就是页面有个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)];
        }
    }
}

你可能感兴趣的:(iOS开发UIScrollView镶嵌一个或者多个UITableView)