OC-scrollview加载多个控制器界面的优化

在开发过程中,经常有一个控制器中多个字控制器界面的管理,如下图:

这种实现方式,很多种,今天主要记录用scrollview实现的方法。并且只加载当前显示界面的数据。

思路:

(1)创建3个需要展示的控制器和1个来展示这3个控制器的控制器

(2)把3个控制器添加在主控制器上

(3)在滚动的时候,判断这个字控制是否已经加载过了,没有的话,就加载,有的话,不做处理

优势:可以避免一次同时加载三个控制器的界面

代码实现如下:

1.创建视图

2.在主控制器中添加3个子控制器

2.1 创建scrollview 并添加3个子控制器,并且调用 scrollViewDidScroll 这个方法,让它默认显示第一个界面

//属性声明
@property (nonatomic, strong) UIScrollView *scrollView;


#pragma mark - 添加滚动视图 
- (void)addScrollView {
    self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
    self.scrollView.pagingEnabled = YES;
    self.scrollView.delegate = self;
    [self.view addSubview:self.scrollView];
    
    /**
     * 注意:以前都是先把控制器的view添加到滚动视图中,会出现一个问题,一进来要加载的数据太多
     *      因此,加载的时候,只加载控制器,不加载控制器的视图,等到需要用到的时候,再viewdidload即可
     */
    
    FirstViewController *firstV = [[FirstViewController alloc] init];
    [self addChildViewController:firstV];
    
    TwoViewController *twoV = [[TwoViewController alloc] init];
    [self addChildViewController:twoV];
    
    ThreeViewController *threeV = [[ThreeViewController alloc] init];
    [self addChildViewController:threeV];
    
    self.scrollView.contentSize = CGSizeMake(self.view.bounds.size.width * 3, self.view.bounds.size.height);

 [self scrollViewDidScroll:self.scrollView];

}

在viewdidload中调用
//添加滚动视图
    [self addScrollView];

 2.2 scrollViewDidScroll 这个方法的实现(这个方法是scrollview的代理),滚动时,判断一下 下个视图是否加载过了,如果没有加载过,就把加载视图到scorllview上

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    self.offIndex = (scrollView.contentOffset.x + self.view.bounds.size.width * 0.5) / self.view.bounds.size.width ;
    //获取contentOffset
    CGPoint currentOffset = scrollView.contentOffset;
    NSInteger page = currentOffset.x / self.view.bounds.size.width;
    //取出对应控制器
    UIViewController *viewController = self.childViewControllers[page];
    //添加到scrollView容器
    if (![viewController isViewLoaded]) {
        
        [self.scrollView addSubview:viewController.view];
        
        viewController.view.frame = CGRectMake(page * self.view.bounds.size.width, 0,self.view.bounds.size.width, self.view.bounds.size.height);
    }
}

这样就可以了,这样就会只有滚动到当前界面时,才加载当前控制器视图的数据了。

原文地址:https://www.cnblogs.com/lyz0925/p/7474527.html