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

这种实现方式,很多种,今天主要记录用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. 总结这几天学到的HTML标签

    1.基础知识W3S,操作慕课网或者FCC网 2.标签必须闭合 标签一般成对出现如:<h1>xxxx</h1> 标签也有空内容标签如:<br/> 标签的属性和属性值放 ...

  2. 不能说的hidden

    不能说的hidden 时光跑跑...路在脚下...晨光依在...----Vashon 1.所谓"时尚",本质上就是自己看不见自己的样子.好比我们在地球上,却感觉不到地球在动. 2. ...

  3. function calling convention

    这是2013年写的一篇旧文,放在gegahost.net上面 http://raison.gegahost.net/?p=31 February 19, 2013 function calling c ...

  4. css3纯手写loading效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. UVA 11922 Permutation Transformer (Splay树)

    题意: 给一个序列,是从1~n共n个的自然数,接下来又m个区间,对于每个区间[a,b],从第a个到第b个从序列中分离出来,翻转后接到尾部.输出最后的序列. 思路: 这次添加了Split和Merge两个 ...

  6. C++#pragma pack指令

    微软官方文档说#pragma pack 指令的作用是为结构.联合和类成员指定 pack 对齐.的主要作用就是改变编译器的内存对齐方式,这个指令在网络报文的处理中有着重要的作用,#pragma pack ...

  7. SQLite -语法

    SQLite -语法 SQLite是紧随其后的是独特的组称为语法的规则和指导方针.本教程为您提供了快速启动和SQLite的清单的所有基本SQLite语法. 大小写敏感性 注意重要的一点是,SQLite ...

  8. scroll offset & client总结

    oEvent.clientX 是指鼠标到可视区左边框的距离. oEvent.clientY 是指鼠标到可视区上边框的距离. clientWidth  是指可视区的宽度. clientHeight  是 ...

  9. 图解在Ubuntu16.04中安装MySQL

    1.安装mysql-server sudo apt-get install mysql-server 输入y,回车.等待下载,安装 出现下图,需要设定Mysql的密码. 输入密码,回车,弹出确认对话框 ...

  10. 模板引擎freemarker的使用(二)

    freemarker默认配置使用时,如果传到前端的值为null或者不存在,后台会报错. 处理方法: <bean id="freemarkerConfig" class=&qu ...