iOS-UIScrollView内容复用【实现两个试图的复用】
前言
这里说的内容复用,是指添加到 ScrollView 里面的试图是同一个模型;比如,我需要在 ScrollView 上添加100个 xkView(其他封装好的VC、UIView),每次滑动 ScrollView 时,只需要更新 xkView 上的内容就行;ScrollView内容较多的情况下,可以考虑复用。
最近做试卷排版,在做试卷展示时,我封装好了一个基于VC的试题模型 PaperQuestionViewController(用于显示每道试题的内容,模板里要加 index 索引属性,便于复用),因为一套试卷,会有100+ 道试题,因为我的排版用到了 Coretext ,如果一下子把100+ 个试图同时添加到ScrollView上,不复用,内存会比较大,这是复用最重要的原因;【也可以用UIcollectionView,根据需求而定】。
实现
当前VC.m
///所有试题数组
@property (nonatomic,strong) NSArray *arrayQuestin; ///UIScrollView
@property (nonatomic,strong) UIScrollView *scrollview; ///保存可见的视图
@property (nonatomic, strong) NSMutableSet *visibleViewControllers; /// 保存可重用的
@property (nonatomic, strong) NSMutableSet *reusedViewControllers;
引用 ScrollView 代理
<UIScrollViewDelegate>
实现代理方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
///更新模板信息
[self showVc];
}
附加方法
///显示试图
- (void)showVc{
// 获取当前处于显示范围的 控制器 索引
CGRect visibleBounds = self.scrollview.bounds;
CGFloat minX = CGRectGetMinX(visibleBounds);
CGFloat maxX = CGRectGetMaxX(visibleBounds);
CGFloat width = CGRectGetWidth(visibleBounds);
NSInteger firstIndex = (NSInteger)floorf(minX / width);
NSInteger lastIndex = (NSInteger)floorf(maxX / width); // 处理越界
if (firstIndex < ) {
firstIndex = ;
}
if (lastIndex >= self.arrayQuestin.count) {
lastIndex = (self.arrayQuestin.count - );
}
// 回收掉不在显示的
NSInteger viewIndex = ;
for (PaperQuestionViewController * vc in self.visibleViewControllers) {
viewIndex = vc.index;
// 不在显示范围内
if ( viewIndex < firstIndex || viewIndex > lastIndex) {
[self.reusedViewControllers addObject:vc];
[vc removeFromParentViewController];
[vc.view removeFromSuperview];
}
}
[self.visibleViewControllers minusSet:self.reusedViewControllers];
// 是否需要显示新的视图
for (NSInteger index = firstIndex; index <= lastIndex; index ++) {
BOOL isShow = NO;
for (BookPaperQuestionViewController * childVc in self.visibleViewControllers) { if (childVc.index == index) {
isShow = YES;
}
}
if (!isShow ) {
[self showVcWithIndex:index];
}
}
} // 显示一个 view
- (void)showVcWithIndex:(NSInteger)index{
PaperQuestionViewController *vc = [self.reusedViewControllers anyObject];
if (vc) {
[self.reusedViewControllers removeObject:vc]; }else{
PaperQuestionViewController *childVc = [[PaperQuestionViewController alloc] init];
[self addChildViewController:childVc];
vc = childVc;
}
CGRect bounds = self.scrollview.bounds;//
CGRect vcFrame = bounds;
vcFrame.origin.x = CGRectGetWidth(bounds) * index;
vc.rectView = vcFrame;
vc.index = index;
vc.view.frame = vcFrame; // 最后在这个地方,更新模板VC中的信息
///更新信息处理
}
iOS-UIScrollView内容复用【实现两个试图的复用】的更多相关文章
- iOS UIScrollView的使用
一.为什么要用UIScrollView? 移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也相当有限当展示的内容较多,超出一个屏幕时,用户可通过滚动手势来查看屏幕以外的内容普通的UIVie ...
- 分列:将excel单元格的内容拆分为两列
提要:处理excel数据时有时需要把单元格的内容拆分为两列,可能方便外部软件的链接,可能使数据显示更明晰等等,有人说直接剪切加粘贴不就可以了吗,但是有时数据过多,这样处理很不效率,网上搜索的方法说插入 ...
- iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接)
iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接) 这里推荐两款好用的Xcode插件,并提供下载链接. 一.插件和使用如下: 1.两款插件 对项目中图片提供自动提示功能的插件:KSImag ...
- IOS UIScrollView常用代理方法
iOS UIScrollView代理方法有很多,从头文件中找出来学习一下 //只要滚动了就会触发 - (void)scrollViewDidScroll:(UIScrollView *)scrollV ...
- iOS --UIScrollView的学习(一)
1.为什么使用UIScrollView 因为移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也相当有限,当展示的内容较多,超出一个屏幕时,用户可通过滚动手势来查看屏幕以外的内容普通的UIV ...
- 李洪强iOS经典面试题34-求两个链表表示的数的和
李洪强iOS经典面试题34-求两个链表表示的数的和 问题 给你两个链表,分别表示两个非负的整数.每个链表的节点表示一个整数位. 为了方便计算,整数的低位在链表头,例如:123 在链表中的表示方式是: ...
- JS判断是IOS还是Android以及如何解决h5打包后在ios下内容与状态栏重叠问题
h5打包后在ios下内容与状态栏重叠问题: 1:知道设备的类型: var u = navigator.userAgent, app = navigator.appVersion; var isAndr ...
- [iOS]UIScrollView嵌套内容在左右拨动的时候自动被顶上问题
遇到的问题是这样的: 适配6+没问题,但是5s就出问题.我UIScrollView嵌套了左侧UIScrollView,右侧UITableView,左右拨动切换,结果5s下拨动之后两边的View都会自动 ...
- iOS 判断内容是否是中文,两种实现
用category实现 新建类别文件,代码 .h文件 #import <Foundation/Foundation.h> @interface NSString (Valid) - (BO ...
随机推荐
- 12月6日 被引入的jsp 页面,引入 js 要注意结束符 要用 </script> 而不是 />
12月6日 被引入的jsp 页面,引入 js 要注意结束符 要用 </script> 而不是 />
- MyEclipse配置Maven插件
一.工具环境 1.jdk-7u80-windows-x64 2.apache-tomcat-7.0.70 3.apache-maven-3.3.9 4.MyEclipse 10.7 5.windows ...
- 《C++ Primer (V4)》读书笔记
第2章 变量和基本类型 1.(P56)如果使用class关键字来定义类,那么定义在第一个访问标号前的任何成员都隐式指定为private:如果使用struct关键字,那么这些成员都是public. 第7 ...
- =delete(c++11)
1.为什么要阻止类对象的拷贝? 1)有些类,不需要拷贝和赋值运算符,如:IO类,以避免多个拷贝对象写入或读取相同的IO缓冲 2.如何阻止? 1)不定义拷贝构造函数和拷贝赋值运算符时,好心的编译器也会及 ...
- 状态机中的RAM注意的问题--减少扇出的办法
可能我不会抓紧时间,所以做事老是很慢.最近在整维特比译码过程深感自己有这样的毛病. 每天会有一点进展,但是却是一天的时间,感觉别人都做起事情来很快.可能这个东西有点难,做 不做得出来都不要紧,但我的想 ...
- python编码(二)
谈谈Unicode编码,简要解释UCS.UTF.BMP.BOM等名词 问题一 使用Windows记事本的“另存为”,可以在GBK.Unicode.Unicode big endian和UTF-8这几种 ...
- tornado+bootstrap急速搭建你自己的网站
bootstrap既然是这么的流行又能省很多的事为什么不用他呢?再加上牛X的produced by FB的tornado简直如虎添翼了! 1. 安装配置 安装所需要的库等内容.这里没什么需要多讲的.t ...
- VMware Workstation 12 OpenGL ES版本支持情况与设置
概述 开始学习Opengl时,发现VMware Workstation虚拟机无法运行Opengl ES2.0的程序.后来,经过查找最终得知,是因为VMware Workstation11及之前的版本对 ...
- ZUFE2389: Occult的卡片升级计划(DP) 2016-05-17 23:12 113人阅读 评论(0) 收藏
2389: Occult的卡片升级计划 Description Occult喜欢玩一款手游,手游中有很多好看的卡片.他想要升级这些卡. 现在他有m块经验石,目标是强化一张卡片,卡片最开始的时候是0级, ...
- win7 环境安装Python + IDE(vs2010)开发
1.下载python安装文件 python-2.7.10.msi 网址:https://www.python.org/downloads/release/python-2710/ ,根据自己环境,选择 ...