节省内存的循环banner(一)

循环banner是指scrollview首尾相连,循环播放的效果,使用非常广泛。例如淘宝的广告栏等。
如果是简单的做法可以把所有要显示的图片全部放进一个数组里,创建相同个数的图片视图来显示图片。这样的话就很浪费内存。为了节省内存,可以用三个图片视图来显示多个图片。分别取名为left middle right
对于用户来说,永远显示的是middle的图片(例如img1),当用户左划时,left显示middle的图片的上一张图片img0,再趁用户不注意的时候将middle的图片改成img0同时设置scrollview的offset值。
考虑到pagecontrol不能加在scrollview上面,只能加在scrollview的superview上,所以如果要封装这个banner视图的话,就需要一个容器视图来显示全部的scrollview、pagecontrol、imageview。

首先,创建一个类继承于uiview。

我们希望外部使用这个类的时候操作尽可能的简便,直接用一个类方法就能创建一个banner视图。并且外部通过这个类方法的参数来告诉bannerview类他要显示的图片和frame。
1 @interface BannerView : UIView
2
3 //给外部一个类方法 1.由外部决定在scrollview上显示的图片 2.显示的尺寸
4 +(BannerView *)bannerWithImages:(NSArray *)images frame:(CGRect)frame;
5
6
7 @end
在内部,要保存一下需要显示的图片数组
#define kWidth (self.frame.size.width)
#define kHeight (self.frame.size.height)
@interface BannerView()
@property (nonatomic ,strong)NSArray *images;
@end +(BannerView *)bannerWithImages:(NSArray *)images frame:(CGRect)frame{
//创建对象
BannerView *bannerV = [[BannerView alloc]initWithFrame:frame];
bannerV.backgroundColor = [UIColor grayColor];
//保存外部传过来的数组
bannerV.images = images; return bannerV;
}
接下来在bannerview里面来布局界面。
1.在xib或者storyboard里面创建的界面要在-(void)awakefromnib方法里面来写布局界面的代码。
2.用代码创建的就在-(instancetype)initWithFrame:(CGRect)frame方法里面写代码。
创建一个scrollview,这个视图后面还要使用,因此定义为属性变量。
1 @property (nonatomic ,strong)UIScrollView *scrollview;
2
3
4 //在init方法里面布局界面
5 -(instancetype)initWithFrame:(CGRect)frame{
6 if (self = [super initWithFrame:frame]) {
7 //scrollview 的frame跟bannerview的一样
8 self.scrollview = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, kWidth, kHeight)];
9 //设置scrollview的属性
10 _scrollview.bounces = NO;
11 _scrollview.showsHorizontalScrollIndicator = NO;
12 //这里contentsize 应为三个视图的总size
13 _scrollview.contentSize = CGSizeMake(kWidth*3, kHeight);
14 _scrollview.pagingEnabled = YES;
15
16 [self addSubview:_scrollview];
17 }
18 return self;
19 }
接下来创建三个图片视图,当作循环的容器。
//创建三个图片视图
@property (nonatomic ,strong)UIImageView *left; @property (nonatomic ,strong)UIImageView *middle; @property (nonatomic ,strong)UIImageView *right;
还要设置这三个图片视图在scrollview上的偏移值。每创建一个imageview都要写的代码,就将它提出去成为一个方法。
1 //创建一个方法设置imageview的位置
2 -(UIImageView *)imageViewWithOffset:(CGFloat)offsetx{
3 UIImageView *imgview = [[UIImageView alloc]initWithFrame:CGRectMake(offsetx, 0, kWidth, kHeight)];
4
5 //设置图片视图的图片填充方式
6 imgview.contentMode = UIViewContentModeScaleAspectFit;
7 [self addSubview:imgview];
8 return imgview;
9 }
在initwithframe方法里面创建三个图片视图
1 //创建三个图片视图 根据视图所在位置把他们加到scrollview上去
2 self.left = [self imageViewWithOffset:0];
3 self.middle = [self imageViewWithOffset:kWidth];
4 self.right = [self imageViewWithOffset:2*kWidth];
节省内存的循环banner(一)的更多相关文章
- [PHP]引用返回与节省内存
PHP中的引用是什么:1.在 PHP 中引用意味着用不同的名字访问同一个变量内容2.引用可以被看作是 Unix 文件系统中的硬链接. 3.使用unset的话,只是删除他这个名字自身对内容的引用,并没有 ...
- python类与对象-如何为创建大量实例节省内存
如何为创建大量实例节省内存 问题举例 在网络游戏中,定义玩家类Player(id, name, level...), 每个玩家在线将创建一个Player实例,当在线人数很多时,将产生大量实例, 如何降 ...
- java内存缓存,节省内存
缓存的对象 这个问题就是我们上面提到的极端情况,在Java中,会对-128到127的Integer对象进行缓存,当创建新的Integer对象时,如果符合这个这个范围,并且已有存在的相同值的对象,则返回 ...
- 这种实现方式比使用 += 要更节省内存和 CPU,尤其是要串联的字符串数目特别多的时候。
这种实现方式比使用 += 要更节省内存和 CPU,尤其是要串联的字符串数目特别多的时候. package main import ( "bytes" "fmt" ...
- JS高级---构造函数通过原型添加方法,原型的作用: 共享数据, 节省内存空间
JS高级---构造函数,通过原型添加方法,原型的作用: 共享数据, 节省内存空间 构造函数 //构造函数 function Person(sex, age) { this.sex = sex; thi ...
- 牺牲速度来节省内存,Redis是觉得自己太快了吗
前言 正常情况下我们选择使用 Redis 就是为了提升查询速度,然而让人意外的是,Redis 当中却有一种比较有意思的数据结构,这种数据结构通过牺牲部分读写速度来达到节省内存的目的,这就是 zipli ...
- 大数据量场景下storm自定义分组与Hbase预分区完美结合大幅度节省内存空间
前言:在系统中向hbase中插入数据时,常常通过设置region的预分区来防止大数据量插入的热点问题,提高数据插入的效率,同时可以减少当数据猛增时由于Region split带来的资源消耗.大量的预分 ...
- storm自定义分组与Hbase预分区结合节省内存消耗
Hbas预分区 在系统中向hbase中插入数据时,常常通过设置region的预分区来防止大数据量插入的热点问题,提高数据插入的效率,同时可以减少当数据猛增时由于Region split带来的资源消耗. ...
- python基础===创建大量对象是节省内存方法
问题: 你的程序要创建大量(可能上百万) 的对象,导致占用很大的内存. 解决方案: 对于主要是用来当成简单的数据结构的类而言,你可以通过给类添加__slots__属性来极大的减少实例所占的内存.比如: ...
随机推荐
- Xtrabackup 全量备份脚本
#!/bin/bash #备份文件的名字为当前主机的IP地址+tar.gz,例如172.16.103.1.tar.gz,且每次备份成功之后都会清空本地的备份目录. #相关目录 mkdir -p /xt ...
- 基于霸道秉火的STM32F103ZET6嵌入式开发之------基于定时TIM3的PWM实验
1:PWM脉冲宽度调制 STM32 的定时器除了 TIM6 和 7.其他的定时器都可以用来产生 PWM 输出.其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出.而通用定 ...
- Go语言核心36讲(Go语言实战与应用三)--学习笔记
25 | 更多的测试手法 在本篇文章,我会继续为你讲解更多更高级的测试方法.这会涉及testing包中更多的 API.go test命令支持的,更多标记更加复杂的测试结果,以及测试覆盖度分析等等. 前 ...
- Spring中bean的初始化和销毁几种实现方式
Bean的生命周期 : 创建bean对象 – 属性赋值 – 初始化方法调用前的操作 – 初始化方法 – 初始化方法调用后的操作 – --- 销毁前操作 – 销毁方法的调用. [1]init-metho ...
- 大一C语言学习笔记(11)---编程篇--写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积,要求 0 bug;
考核内容: 写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积: 答案: #include<stdio.h ...
- 痞子衡嵌入式:在IAR开发环境下RT-Thread工程函数重定向失效分析
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下RT-Thread工程函数重定向失效分析. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...
- [loj3032]馕
(直接贪心会导致分子和分母过大) 令$S_{i}=\sum_{j=1}^{L}V_{i,j}$(即其独吞整个馕的快乐度),对第$i$个人求出$n$个位置$x_{1},x_{2},...,x_{n-1} ...
- [bzoj1576]安全路径
先建立最短路径树(即跑dij每一个点向更新他的点连边),考虑一个点的答案路径一定要走过且仅走过一条非树边,枚举非树边(x,y),对于一个点k,如果它在x~lca上(y~lca的路径上同理),那么答案可 ...
- [atAGC045D]Lamps and Buttons
由于$p_{i}$是随机的,不断选择最小的.未被操作过的$i$并处理其所在的环一定是最优的,而这样与已知$p_{i}$的区别是,当选择了一个$i=p_{i}$,那么必然失败(而已知$p_{i}$时不会 ...
- [luogu5387]人形演舞
先对每一个求sg函数,暴力复杂度为$o(m^{2})$ 取$k$满足$2^{k}\le x<2^{k+1}$(即$x$二进制下的最高位),考虑$y$与$2^{k}$的关系 1.若$1\le y& ...