穿透效果需要做到两点:
1.tableView的可视范围占据整个父控件(或者屏幕)--设置contentsize滚动范围。
2.所有的cell都可以被看到,也就是说tableView中的cell不会被导航栏,titleView以及TabBar所遮挡--设置contentInset内边距。
例如:首页控制器的view的第一个子控件是scrollView(添加子控制器视图tableview),而且首页控制器包裹了导航控制器和TabBarController,所以,scrollView的内容上边被挤下来64,下边被挤上去49.
解决方案:
1.可视范围:
1.1告诉系统不要自动调整scrollView的内边距
首页控制器.automaticallyAdjustsScrollViewInsets = NO;
经过这个操作,scrollView的内容(tableView)确实上移了,但是还是预留除了20,这个时候通过打印知道tableView的y值为20,height = 667-20 = 647;
1.2.设置tableView的y = 0.
1.3.设置tableView的height = scrollView.height;
这个时候就实现了tableView的可视范围为整个scrollView.换句话说tableView和scrollView完全重合.
但是:
新的问题出现了:这个时候的tableView和scrollView完全重合,tableView中的内容(在这里是cell,如果有tableHeaderView的话就包括tableHeaderView)和tableview完全重合.那么就会有一部分cell被导航控制器以及titleView挡住.当下拉下来以后,松手就由弹上去了.内容被遮挡.同样底部也会被TabBar挡住
2.不被导航栏遮住内容:
解决方案:给tableView增加额外的滚动区域,即设置内边距,其中上边设置64(导航条高度)+35(titleView的高度),下边设置49(TabBar高度)
具体代码:
scrollView.contentInset = UIEdgeInsetsMake(64 + 35, 0, 49, 0);
到现在为止完成了所有步骤:
1.通过改变tableView的frame --以及让系统不要自动调整scrollView的内边距让tableView的可视范围为占据整个scrollView
2.通过设置tableView的内边距,让tableView中的所有cell都可以显示,即往下走一个导航栏的高度.
具体代码示例:
// 向首页的view中添加内容视图--scrollerview(scrollerview中添加一个子控制器的tableview)
- (void)setupContentScrollView{
//子控制器的tableview添加到scrollerview上,向下走了64的距离,因为导航栏的问题,往scrollerview上添加内容时,会向下走.
//通过下面的一行代码--取消自动设置64的内边距
self.automaticallyAdjustsScrollViewInsets=NO;
UIScrollView*scrollV = [[UIScrollView alloc] init];
scrollV.backgroundColor= [UIColorgreenColor];
//设置scrollerview的frame=屏幕的bounds.
scrollV.frame=self.view.bounds;
[self.view addSubview:scrollV];
NSLog(@"%f",scrollV.frame.size.height);
NSLog(@"%f",scrollV.frame.origin.y);//0
//遍历子控制器,将view添加到scrollerview上
NSIntegerchildViewCount =self.childViewControllers.count;
for(NSIntegeri =0; i < childViewCount; i++) {
UITableViewController*childVc =self.childViewControllers[i];
CGFloatchildViewW = scrollV.TSY_width;
CGFloatchildViewH = scrollV.TSY_height;
CGFloatchildViewX = i * childViewW;
CGFloatchildViewY =0;
childVc.view.frame=CGRectMake(childViewX, childViewY,childViewW, childViewH);
// 设置内边距
childVc.tableView.contentInset = UIEdgeInsetsMake(TSYNavH + TSYTitleViewH, 0, TSYTabbarH, 0);
childVc.view.backgroundColor=TSYRandomColor;
[scrollVaddSubview:childVc.view];
}
//设置scrollerview的内容的滚动范围
scrollV.contentSize=CGSizeMake(childViewCount* scrollV.TSY_width,0);
//设置分页效果
scrollV.pagingEnabled=YES;
}