美文网首页iOS接下来要研究的知识点移动客户端
iOS开发中解决UITableView嵌套ScrollView(

iOS开发中解决UITableView嵌套ScrollView(

作者: 梁森的简书 | 来源:发表于2020-08-24 19:07 被阅读0次

    之前写过类似的(https://www.jianshu.com/p/b867ed4ee9e3),这里就当温故而知新吧!

    功能

    一个tableView上的某个cell(后面用cellA代替)上有一个scrollView,该scrollView上添加了几个tableView。要求在cellA所在的section的sectionHeader滑动到顶部的时候cellA上的scrollView上的几个tableView可以滑动,否则不能滑动。

    想要的效果

    0.效果 (1) (1).gif

    最初的效果

    0.开始效果.gif

    解决思路

    1.需要底部的tableView能够同时响应多个手势(这样在滑动子tableView时候,底部的tableView也能滑动)

    注:UITableView默认是不能响应多个手势的。在OC中我们只需创建一个继承自UITableView的子类,并在该子类中重写shouldRecognizeSimultaneouslyWithGestureRecognizer方法即可。在该方法中判断当前与用户交互的视图是那种类型的视图,并处理当前UITableView是否能同时响应该手势。而在swift中我们不能重写方法,应该遵守UIGestureRecognizerDelegate协议,并实现该协议中的shouldRecognizeSimultaneouslyWith代理方法。

    2.在最开始的时候底部tableView能够滑动,scrollView上的tableView不能滑动。
    3.当cellA所在的section的sectionHeader滑动到顶部的时候,scrollView上的几个tableView可以滑动。
    4.当scrollView上的tableView在Y方向的偏移量为0的时候,scrollView上tableView不能滑动,底部的tableView能滑动。

    注意:tableView能滑动或不能滑动不是设置它们的滑动属性为YES或NO,而是设置偏移量为CGPointZero。

    核心代码:

    1.监听底部tableView的偏移量,从而设置该tableView以及scrollView上几个tableView是否能滑动

      - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    CGFloat statusH = [UIApplication sharedApplication].statusBarFrame.size.height;
    CGFloat navigationBarH = self.navigationController.navigationBar.frame.size.height;
    CGFloat bottomCellOffset = [self.tableView rectForSection:3].origin.y - statusH - navigationBarH;
    
    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);
    }
    }
    }
    

    2.设置scrollView上几个tableView是否能滑动

      - (void)setCellCanScroll:(BOOL)cellCanScroll{
    _cellCanScroll = cellCanScroll;
    for (SubTableView * tableView in self.subTableviews) {
    tableView.canScroll = cellCanScroll;
    if (cellCanScroll) {
      NSLog(@"可以滑动了...");
    }else{
      tableView.contentOffset = CGPointZero;
    }
    }
    }
    

    3.监听scrollView上几个tableView的偏移量,从而通知底部tableView是否可滑动

      - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    NSInteger viewTag = scrollView.tag;
    for (NSInteger i = 0; i < self.subTableviews.count; i ++) {
    if (viewTag == i) {
      SubTableView * tableview = self.subTableviews[i];
      if (tableview.canScroll) {
        NSLog(@"😄😄😄😄😄😄😄😄");
      }else{
        tableview.contentOffset = CGPointZero;
      }
      if (tableview.contentOffset.y <= 0) {
          tableview.canScroll = NO;
          tableview.contentOffset = CGPointZero;
          [[NSNotificationCenter defaultCenter] postNotificationName:@"mainCanScroll" object:nil];//到顶通知父视图改变状态
      }
    }
    }
    
    }
    

    4.接收通知,从而设置底部tableView以及scrollView上几个tableView是否能滑动

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeScrollStatus) name:@"mainCanScroll" object:nil];
    }
    - (void)changeScrollStatus{
    self.canScroll = YES;
    self.subCell.cellCanScroll = NO;
    }
    

    demo地址:

    https://github.com/yangguanghei/table-scroll

    相关文章

      网友评论

        本文标题:iOS开发中解决UITableView嵌套ScrollView(

        本文链接:https://www.haomeiwen.com/subject/dzanjktx.html