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

这种实现方式,很多种,今天主要记录用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);
}
}

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

OC-scrollview加载多个控制器界面的优化的更多相关文章

  1. oc懒加载 & swift lazy

    oc的懒加载依赖于属性的双重属性的函数属性部分. 懒加载的本质是执行get函数. swift的lazy,理论上与此类似. 编译器优化时可能对初始化块进行了保存. 懒加载的本质是延迟执行. 只要是执行, ...

  2. OC中加载html5调用html方法和修改HTML5内容

    1.利用webView控件加载本地html5或者网络上html5 2.设置控制器为webView的代理,遵守协议 3.实现代理方法webViewDidFinishLoad: 4.在代理方法中进行操作H ...

  3. NestedScrollView、ScrollView 加载完自动滑动至底部问题的解决方案

    正常情况下,由于NestedScrollView/ScrollView 嵌套RecyclerView,可能会导致Recyclerview占据焦点导致整个NestedScrollView/ScrollV ...

  4. as3.0加载swf并控制

    私人QQ 280841609 var myload:Loader=new Loader(); var url:URLRequest=new URLRequest("1.swf"); ...

  5. android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存

    经常会用到 网络文件 比如查看大图片数据 资源优化的问题,当然用开源的项目  Android-Universal-Image-Loader  或者 ignition 都是个很好的选择. 在这里把原来 ...

  6. Android图片加载库:最全面的Picasso讲解

    前言 上文已经对当今 Android主流的图片加载库 进行了全面介绍 & 对比 如果你还没阅读,我建议你先移步这里阅读 今天我们来学习其中一个Android主流的图片加载库的使用 - Pica ...

  7. Android 滚动RecyclerView加载图片时的流畅度优化

    实现:使用onScrollStateChanged回调检测滚动状态,并在RecyclerViewAdapter内部设置类似isScrolling的状态值来控制网络图片的加载. 下面是代码举例: // ...

  8. 【JavaScript】图片加载由模糊变清晰 —— 图片优化

    开发过程中,一些图片的展示时,加载很慢很久,后来把图片缩放压成缩略图吧,速度是快了但是模糊不清,如何处理这样问题,下面就和大家分享一下自己的处理方法. 先让客户端加载像素小的缩略图: <img ...

  9. js怎么动态加载js文件(JavaScript性能优化篇)

    下面介绍一种JS代码优化的一个小技巧,通过动态加载引入js外部文件来提高网页加载速度 [基本优化] 将所有需要的<script>标签都放在</body>之前,确保脚本执行之前完 ...

随机推荐

  1. vue安装概要以及vue测试工具

    一.概述 1.安装node,去node官网 2.新建一个项目,通过npm init命令初始化,即创建一个package.json文件 3.用命令 npm install vue -g 全局安装vue( ...

  2. (5)《Head First HTML与CSS》学习笔记---布局与定位

    层叠与CSS的权重判断 1.要理解层叠,除了前面的内容外还差最后一个知识点.你已经知道如何使用多个样式表来更好地组织你的样式,或者支持不同类型的设备.不过实际上用户访问你的页面时还有另外一些样式表. ...

  3. laravel模型关联

    hasOne 一对一 用户名-手机号hasMany 一对多   文章-评论belongTo 一对多反向 评论-文章belongsToMany    多对多 用户-角色hasManyThrough 远程 ...

  4. (C#)Xamarin.ios 发布到 App Store

    项目做到尾声了,IOS要发布,程序猿力Max来了. 不过就公司开发者账号就弄了一个月多,期间因为申请过D-U-N-S客服联系要公司资料时我们中途说取消了,后来再申请不知多少次了都没再回复... 给美国 ...

  5. H3C S5024P交换机互连实验

    第一次周二网络管理实验报告 交换机互联实验 实验接线图: 交换机全貌: 可以通过超级终端和telnet来配置交换机       控制电缆连交换机console口与计算机主机(只可以传送命令不可以通信, ...

  6. Modal 高度 在里面css里写高 | iview

    .modalCss { height: 330px; overflow: auto; padding-right: 10px; }

  7. CPP-基础:inline

    背景: 在C&C++中 一.inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义. 表达式形式的宏定义一例: #define ExpressionNam ...

  8. IFE春季班第一阶段任务(请仔细阅读)

    第一阶段的主要目标是帮助大家 了解.认识.学习.掌握HTML及CSS.第一阶段任务从 3月14日 开始,持续到 4月3日.当然,您也可以在这个时间以后继续自行实践练习. 第一阶段任务一共有 12 个题 ...

  9. Sphinx排序模式

    目前SPHINX支持6种排序模式.分别是: 1. SPH_SORT_RELEVANCE2. SPH_SORT_ATTR_DESC3. SPH_SORT_ATTR_ASC4. SPH_SORT_TIME ...

  10. 退役选手ZlycerQan的强大的的高精度

    #include <cstdio> #include <iostream> #include <vector> #include <iomanip> # ...