一个控制器(UIViewController)中需要管理多个tableView,addChildViewController注意事项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个控制器(UIViewController)中需要管理多个tableView,addChildViewController注意事项相关的知识,希望对你有一定的参考价值。

有时候,一个控制器(UIViewController)中需要管理多个tableView,我们需要将多个控制器加入到主控制器中去。使用UIViewController的addChildViewController方法即可。但是这时可能会在tableView的位置上出现问题:

1、UIViewController的automaticallyAdjustsScrollViewInsets属性是会根据所在界面的status bar,navigationbar,tabbar的高度,自动调整scrollView的insets。一般我们会将该属性设置为NO,手动管理布局。

  在ViewDidLoad中设置self.automaticallyAdjustsScrollViewInsets = NO;

2、这时添加进去的tableView的frame的Y值为0,会隐藏64的位置,我们需要在添加子控制器的tableView的时候,设置tableView的contentInset与scrollIndicatorInsets的距离顶部和底部的距离:

  vc.tableView.contentInset = UIEdgeInsetsMake(64,0,self.tabBarController.tabBar.height,0);

  // 设置滚动条的内边距

  vc.tableView.scrollIndicatorInsets = vc.tableView.contentInset;

  此处的64即导航条的高度,距离底部的高度是self.tabBarController.tabBar.height(49)

3、另外,我们需要创建一个scrollView来包含所有的tableView,控制各个tableView的显示。

  

#pragma mark - 懒加载

- (UIScrollView *)scrollView

{

    if (!_scrollView) {

        _scrollView = [[UIScrollView alloc]init];

        _scrollView.frame = self.view.bounds;

        _scrollView.delegate = self;

        _scrollView.pagingEnabled = YES;

        _scrollView.contentSize = CGSizeMake(_scrollView.width * self.childViewControllers.count, 0);

  // 添加默认的控制器

        [self scrollViewDidEndScrollingAnimation:_scrollView];

    }

    return _scrollView;

}

 

#pragma mark - UIScrollViewDelegate

// scrollView停止滑动时调用:非手动拖动时调用

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView

{

    NSInteger index = scrollView.contentOffset.x / scrollView.width;

    UITableViewController *controller = self.childViewControllers[index];

    controller.view.frame = CGRectMake(scrollView.contentOffset.x, 0, screenW, scrollView.height);

    controller.tableView.contentInset = UIEdgeInsetsMake(64, 0, self.tabBarController.tabBar.height, 0);

    controller.tableView.scrollIndicatorInsets = controller.tableView.contentInset;

     [scrollView addSubview:controller.view];

}

// scrollView停止滑动时调用:手动滑动时调用

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

{

    [self scrollViewDidEndScrollingAnimation:scrollView];

}

以上是关于一个控制器(UIViewController)中需要管理多个tableView,addChildViewController注意事项的主要内容,如果未能解决你的问题,请参考以下文章

UIViewController

通过 UIViewController 传递触摸

uiviewcontroller 黑色

带有 UICollectionView 的基础 UIViewController

导航控制器中的 UIViewController 缺少返回按钮

如何找到根 UIViewController