iOS scrollView嵌套tableView的手势冲突解决方案

栏目: IOS · 发布时间: 6年前

内容简介:在平时项目中,我们经常会碰到类似UIScrollView嵌套UITableView的需求,虽然苹果并不建议这种做法,但是这样的需求在平时工作中还是很常见的。比如笔者公司项目之前用到的地方:可以看到最上面是一块轮播图组件,我也已经整理了

在平时项目中,我们经常会碰到类似UIScrollView嵌套UITableView的需求,虽然苹果并不建议这种做法,但是这样的需求在平时工作中还是很常见的。比如笔者公司项目之前用到的地方:

iOS scrollView嵌套tableView的手势冲突解决方案

可以看到最上面是一块轮播图组件,我也已经整理了 一份轮播图组件在github上面 ,轮播图下面还有若干条其他的内容,而且这几块内容都是后台动态控制显示的,所以这里用UIScrollView设置顶部偏移量实现是很不方便的。最外层我肯定选择使用tableView分区管理来实现。而下面的横向分类页面肯定需要tableView去实现

这样的话问题就来了,先不说下面的横向分页如何实现,这个页面必定需要在一个tableView中嵌套多个不同的tableView,但是如果嵌套了其他的scrollView,就需要我们判断不同条件下让哪个scrollView响应滑动事件,因此这里我们需要解决的就是 手势的冲突问题

最开始想到的是在滑动tableView时候根据偏移量设置scrollEnabled来控制两个tableView的响应,但是会有个问题就是当滚动到顶部时用户必须第二次滑动才可以显示出外层的tableView,这样就会造成一个卡顿的效果,所以这个方法是行不通的。

下面说一下我的解决思路:

这里就直接分为mainTableView和subTableView,设置mainTableView的联动手势UIGestureRecognizer

/**
 同时识别多个手势

 @param gestureRecognizer gestureRecognizer description
 @param otherGestureRecognizer otherGestureRecognizer description
 @return return value description
 */
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

下面的分类pageView是直接使用了封装的page框架 FSScrollContentView ,在mainTableView的UIScrollViewDelegate方法内判断mainTableView的偏移量,当标题栏滚动到顶部的时候固定mainTableView的偏移量

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat bottomCellOffset = [_tableView rectForSection:1].origin.y - 64;
    if (scrollView.contentOffset.y >= bottomCellOffset) {
        scrollView.contentOffset = CGPointMake(0, bottomCellOffset);
        if (self.canScroll) {
            self.canScroll = NO;
            self.contentCell.cellCanScroll = YES;
        }
    }else{
        if (!self.canScroll) {//子视图没到顶部
            scrollView.contentOffset = CGPointMake(0, bottomCellOffset);
        }
    }
    self.tableView.showsVerticalScrollIndicator = _canScroll?YES:NO;
}

上面代码中的canScroll是定义的一个BOOL变量用来控制mainTableView的偏移量

此时,subTableView收到可以滚动的信号cellCanScroll,才开始响应滑动的手势,在subTableView的UIScrollViewDelegate方法内实现:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (!self.vcCanScroll) {
        scrollView.contentOffset = CGPointZero;
    }
    if (scrollView.contentOffset.y <= 0) {
        if (!self.fingerIsTouch) {
            return;
        }
        self.vcCanScroll = NO;
        scrollView.contentOffset = CGPointZero;
        [[NSNotificationCenter defaultCenter] postNotificationName:@"leaveTop" object:nil];//到顶通知父视图改变状态
    }
    self.tableView.showsVerticalScrollIndicator = _vcCanScroll?YES:NO;
}

其实到这里会发现主要是通过设置两个scrollView的偏移量来解决这个手势冲突的问题。因为代码已经表达的很清楚,不太擅长表达,这里只是大概描述一下使用场景。

具体的实现方式已经写成了一个demo,里面也有详细的注释,可以前去下载: FSScrollViewNestTableView

2017.6.21--应网友要求,demo添加了刷新逻辑

给大家看一下实现后的效果图:

iOS scrollView嵌套tableView的手势冲突解决方案

这里只是提供了一种解决方案,欢迎提出问题多多交流

作者:PURE蓝胖子

链接:https://www.jianshu.com/p/8bf6c2953da3


以上所述就是小编给大家介绍的《iOS scrollView嵌套tableView的手势冲突解决方案》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

人月神话(40周年中文纪念版)

人月神话(40周年中文纪念版)

(美) 布鲁克斯(Brooks, F. P.) 著 / UML China翻译组,汪颖 译 / 清华大学出版社 / 2015-4-1 / 68.00元

在软件领域,很少能有像《人月神话》一样具有深远影响力和畅销不衰的著作。Brooks博士为人们管理复杂项目提供了最具洞察力的见解,既有很多发人深省的观点,又有大量软件工程的实践。本书内容来自Brooks博士在IBM公司SYSTEM/360家族和OS/360中的项目管理经验,该项目堪称软件开发项目管理的典范。该书英文原版一经面世,即引起业内人士的强烈反响,后又译为德、法、日、俄、中、韩等多种文字,全球......一起来看看 《人月神话(40周年中文纪念版)》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器