UIScrollView极限优化:两个UIImageView循环利用
2015-07-23 10:47
531 查看
iOS开发中,UIScrollView在大部分情况下,用for循环往里面直接塞UIImageView就OK了。但是如果需要展示的图片非常多,比如十张,几十张,甚至上百张,直接往UIScrollView里面塞上百的UIImageView肯定是行不通的。明显需要优化。
UIScrollView在不滚动的时候,只会有一张图出现在视野中,滚动的时候同一时刻也最多只会有两张图出现在视野中。如图所示。既然同一时刻最多只会有两张图在视野中,那么也既是同一时刻我们需要的imageView最多只要两个就够了,其他的就算添加到了scrollView中也看不到。
一张图
两张图
根据以上分析,可以建立容器
当scrollView第一次出现的时候,首先需要在屏幕中显示
将视图1添加到scrollView.
将视图1添加到
如果向左滑动,会出现
到
将视图2添加到
将视图2添加到scrollView中,并进行一些个性设置,比如位置,图片等。
如果继续像左滑动,直到视图1看不见的那一刻,也做三件事。
视图1调用
将视图1放进
将视图1从
如果再继续滑动,则又回到了
UIScrollView在不滚动的时候,只会有一张图出现在视野中,滚动的时候同一时刻也最多只会有两张图出现在视野中。如图所示。既然同一时刻最多只会有两张图在视野中,那么也既是同一时刻我们需要的imageView最多只要两个就够了,其他的就算添加到了scrollView中也看不到。
一张图
两张图
根据以上分析,可以建立容器
reusedImageViews来存放可以重用的imageView,建立容器
visibleImageViews来存放在视野范围内的imageView。
1 2 3 4 5 6 7 8 9 | /** * 保存可见的视图 */ @property (nonatomic, strong) NSMutableSet *visibleImageViews; /** * 保存可重用的视图 */ @property (nonatomic, strong) NSMutableSet *reusedImageViews; |
一张完整的图,此时做两件事。
将视图1添加到scrollView.
将视图1添加到
visibleImageViews进行保存.
1 2 | [self.visibleImageViews addObject:imageView]; [self.scrollView addSubview:imageView]; |
一张图->两张图
如果向左滑动,会出现两张图的情况,视图2也需要加入显示,当开始滑动的那一刻,做三件事。
到
reusedImageViews中查找可重用的imageView,如果没找到,则新建一个。假设得到的是视图2。
将视图2添加到
visibleImageViews进行保存,如果视图2是在
reusedImageViews中找到的(不是新建的),那么需要将视图2从
reusedImageViews中移除。相当于将视图2从
reusedImageViews移动到了
visibleImageViews。
将视图2添加到scrollView中,并进行一些个性设置,比如位置,图片等。
1 2 3 4 5 6 7 8 910 | UIImageView *imageView = [self.reusedImageViews anyObject]; |
两张图->一张图
如果继续像左滑动,直到视图1看不见的那一刻,也做三件事。视图1调用
removeFromSuperview从scrollView中移除.
将视图1放进
reusedImageViews中等待被重用
将视图1从
visibleImageViews中移除,因为它已经属于
reusedImageViews了。
1 2 3 4 5 6 7 8 910 | // 回收不再显示的ImageView NSInteger imageViewIndex = 0; for (UIImageView *imageView in self.visibleImageViews) { imageViewIndex = imageView.tag; // 不在显示范围内 if (imageViewIndex < firstIndex || imageViewIndex > lastIndex) { [self.reusedImageViews addObject:imageView]; [imageView removeFromSuperview]; } } [self.visibleImageViews minusSet:self.reusedImageViews]; |
一张图->两张图的情况,以此类推,利用重用进行优化的目的就达到了。以下是测试输出(不包含垂直和水平的滚动条),通过子视图地址和子视图个数可以看到,无论怎么滚动,scrollView中只会存在两个imageView。
相关文章推荐
- [工作积累] jboolean is neither JNI_TRUE nor JNI_FALSE
- FFmpeg Filtering Guide参数说明
- Simple Java GUI DEMO(quote from head first java 2e)
- IOS开发之UITableView
- 如何修改序列(Sequence)的初始值(START WITH)
- 动态计算UITableViewCell高度
- /var/spool/clientmqueue文件多导致磁盘满
- java.lang.ClassNotFoundException: com.opensymphony.xwork2.util.ValueStack
- 【从零开始学NGUI 】 (五)PopupList
- make 2>&1 | tee build.log 求解释
- [leetcode] Longest Consecutive Sequence
- 【Guitar Pro 6 中文破解版】完整安装教程+下载地址
- soapui 不同版本之间切换excel
- 2.RequestParam、RequestHeader、CookieValue注解
- hdu5297 Y sequence(容斥原理+迭代)
- Hibernate Query Language
- 自定义系统控件的外观:UIApearance
- 小胖说事34-----iOS UIImageView 的contentMode属性应用
- [转载]Integer.parseInt()和这个Integer.valueOf()的详解
- Win10准正式版Build 10240多国语言包下载(含111种)