UITableView套UITableView数据刷新

https://www.jianshu.com/p/ee4b2bd54d08

网上关于tableview嵌套tableview的文章很多,纵览很多后发现有两点没有满足需求

 

把两个tableview放在一个控制器中这样对大批量的数据处理不够友好

没有做到tableview互斥滚动(只有一个可以滚动)

 

主要的一点

在父控制器的tableview的GSTableview.m文件中实现这个方法

/**

 同时识别多个手势

 

 @param gestureRecognizer gestureRecognizer description

 @param otherGestureRecognizer otherGestureRecognizer description

 @return return value description

 */

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

{

    return YES;

}

 

实现的原理是

 

 

当子控制器中的tableview偏移量<=0 的时候让这个tableview不能滚动  代码表示为 scrollView.contentOffset = CGPointZero;  并且通知父控制器可以滚动

 

 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

    NSLog(@"scrollView.contentOffset.y===   %f",scrollView.contentOffset.y);

    // 只有控制这个tableview的滑动才可以 实现下拉刷新 所以设置scrollView.contentOffset = CGPointZero

    // 向下拖动  scrollView.contentOffset.y 值小于零

    //  vcCanScroll 从上一个控制器传递过来

 

    if (!_vcCanScroll) {

       scrollView.contentOffset = CGPointZero;

        

    }

    if (scrollView.contentOffset.y <= 0) {

        _vcCanScroll = NO;

        // 到顶通知父视图改变状态  用于有多个同级的控制器  用来设置所有控制器中的tableview 偏移量设置为 CGPointZero  还有就是设置父控制器中tableview的  canScroll;

         scrollView.contentOffset = CGPointZero;

        [[NSNotificationCenter defaultCenter] postNotificationName:@"leaveTop" object:nil];

        

    }

 

    // 设置是否显示垂直滚动条 VerticalScrollIndicator

    self.tableView.showsVerticalScrollIndicator =_vcCanScroll?YES:NO;

    

}

 

父控制器在接受到通知执行的操作

- (void)changeSrollStatus{

通知让父控件可以滚动

    self.canScroll = YES;

}

 

 

 

当父控制器可以滚动的时候 设置子控制器中tableview 不能滚动  代码中是通过设置属性来实现的  self.childViewController.vcCanScroll = YES;

父控制器的scrollviewDelegate

 

 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

    CGFloat bottomCellOffset = [_gsTableView rectForSection:1].origin.y - 64;

    if (scrollView.contentOffset.y >= bottomCellOffset) {

        scrollView.contentOffset = CGPointMake(0, bottomCellOffset);

        

        if (self.canScroll) {

            self.canScroll = NO;

            self.childViewController.vcCanScroll = YES;

          

        }

    }else{

        if (!self.canScroll) {

            scrollView.contentOffset = CGPointMake(0, bottomCellOffset);

        }

    }

    self.gsTableView.showsVerticalScrollIndicator = _canScroll?YES:NO;

}

 

 

 

子控制器中设置

 

- (void)setVcCanScroll:(BOOL)vcCanScroll{

    _vcCanScroll = vcCanScroll;

 

}

 

代码地址

 

作者:codeShuai

链接:https://www.jianshu.com/p/ee4b2bd54d08

来源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

 

 

 

 
662374-878970908d46ae99.gif
error.gif

 

 
662374-c2406953c749f245.gif
right.gif
 

造成闪烁的原因,主要是因为CALayer有一个隐式动画,只要在调用reloadData刷新时,关闭隐式动画就可以避免了。代码示例如下:

 

[CATransaction setDisableActions:YES];

[self.collectionView reloadData];

[CATransaction commit];

--------------------- 

作者:weixin_33912246 

来源:CSDN 

原文:https://blog.csdn.net/weixin_33912246/article/details/87000284 

版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-03-16 18:49  sundaysios  阅读(521)  评论(0编辑  收藏  举报