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

这种实现方式,很多种,今天主要记录用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. pandas DataFrame 警告(SettingWithCopyWarning)

    转自:https://www.cnblogs.com/pig-fly/p/7875472.html 刚接触python不久,编程也是三脚猫,所以对常用的这几个工具还没有一个好的使用习惯,毕竟程序语言是 ...

  2. 安装mysql时 make 时 提示 redeclaration of C++ built-in type ‘bool’ 错误

    安装mysql时 make 时 提示 redeclaration of C++ built-in type ‘bool’ 错误 由于gcc-c++是在./configure后进行编译的 重新./con ...

  3. Oracle | Java日期处理

    public class Test{         public static void main (String args []){                               j ...

  4. Redis杂谈

    这是2015年初应邀在南华智闻作技术交流时所作的Redis方面的一个presentation. 因为原件是Keynote格式,已经转成PDF,点击下面链接打开或者下载PDF: Redis 杂谈

  5. PMP项目管理学习笔记(6)——整合管理之制订项目管理计划

    制订项目管理计划 输入:项目章程.组织过程资产.企业环境要素.计划过程的输出(): 工具:专家判断 输出:项目管理计划 项目管理计划使你在问题发生之前做出规划 你要在计划过程组中明确如何完成项目——因 ...

  6. 使用原生JavaScript模拟getElementByClassName .

    最近在工作中,由于有一个插件必须使用jquery-pack.js,而这个包又是非常古老的jquery,所以又的函数是无法使用的,例如$()选择器以及parent()都取不到标签的内容. 所以没办法,只 ...

  7. https://www.runoob.com/python/python-variable-types.html

    https://www.runoob.com/python/python-variable-types.html

  8. 如何快速上手基础的CSS3动画

    前言 说起CSS3动画,就必须说说 transform,translate,transition,animation这4个属性,transform主要定义元素的动作,比如旋转.倾斜.位移等,trans ...

  9. ajax从入门到深入精通

    前言 ajax全称Asynchronous Javascript and XML.其中Asynchronous代表异步.同步于异步是描述通信模式的概念,同步机制:发送方发生请求后,需要等待接收到接收方 ...

  10. python 变量引用

    最近在看<<流畅的python>>关于变量引用部分时,有一些自己的看法,就再次记录一下. 问题: # From flunet python example 8-8 class ...