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
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
造成闪烁的原因,主要是因为CALayer有一个隐式动画,只要在调用reloadData刷新时,关闭隐式动画就可以避免了。代码示例如下:
[CATransaction setDisableActions:YES];
[self.collectionView reloadData];
[CATransaction commit];
---------------------
作者:weixin_33912246
来源:CSDN
原文:https://blog.csdn.net/weixin_33912246/article/details/87000284
版权声明:本文为博主原创文章,转载请附上博文链接!