循环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(一)的更多相关文章

  1. [PHP]引用返回与节省内存

    PHP中的引用是什么:1.在 PHP 中引用意味着用不同的名字访问同一个变量内容2.引用可以被看作是 Unix 文件系统中的硬链接. 3.使用unset的话,只是删除他这个名字自身对内容的引用,并没有 ...

  2. python类与对象-如何为创建大量实例节省内存

    如何为创建大量实例节省内存 问题举例 在网络游戏中,定义玩家类Player(id, name, level...), 每个玩家在线将创建一个Player实例,当在线人数很多时,将产生大量实例, 如何降 ...

  3. java内存缓存,节省内存

    缓存的对象 这个问题就是我们上面提到的极端情况,在Java中,会对-128到127的Integer对象进行缓存,当创建新的Integer对象时,如果符合这个这个范围,并且已有存在的相同值的对象,则返回 ...

  4. 这种实现方式比使用 += 要更节省内存和 CPU,尤其是要串联的字符串数目特别多的时候。

    这种实现方式比使用 += 要更节省内存和 CPU,尤其是要串联的字符串数目特别多的时候. package main import ( "bytes" "fmt" ...

  5. JS高级---构造函数通过原型添加方法,原型的作用: 共享数据, 节省内存空间

    JS高级---构造函数,通过原型添加方法,原型的作用: 共享数据, 节省内存空间 构造函数 //构造函数 function Person(sex, age) { this.sex = sex; thi ...

  6. 牺牲速度来节省内存,Redis是觉得自己太快了吗

    前言 正常情况下我们选择使用 Redis 就是为了提升查询速度,然而让人意外的是,Redis 当中却有一种比较有意思的数据结构,这种数据结构通过牺牲部分读写速度来达到节省内存的目的,这就是 zipli ...

  7. 大数据量场景下storm自定义分组与Hbase预分区完美结合大幅度节省内存空间

    前言:在系统中向hbase中插入数据时,常常通过设置region的预分区来防止大数据量插入的热点问题,提高数据插入的效率,同时可以减少当数据猛增时由于Region split带来的资源消耗.大量的预分 ...

  8. storm自定义分组与Hbase预分区结合节省内存消耗

    Hbas预分区 在系统中向hbase中插入数据时,常常通过设置region的预分区来防止大数据量插入的热点问题,提高数据插入的效率,同时可以减少当数据猛增时由于Region split带来的资源消耗. ...

  9. python基础===创建大量对象是节省内存方法

    问题: 你的程序要创建大量(可能上百万) 的对象,导致占用很大的内存. 解决方案: 对于主要是用来当成简单的数据结构的类而言,你可以通过给类添加__slots__属性来极大的减少实例所占的内存.比如: ...

随机推荐

  1. 关于Arrays类的静态方法asList()

    Array.asList():是数组转成集合的方法 List<String> list = Arrays.asList(new String[]{"AA", " ...

  2. 力扣 - 剑指 Offer 30. 包含min函数的栈

    题目 剑指 Offer 30. 包含min函数的栈 思路1 使用一个辅助栈min_stack,用来维护栈的最小的元素 每次添加元素入栈时候,data_stack和min_stack都要同时维护 dat ...

  3. 4. 理解Update、Enter、Exit 与 添加、删除元素

    理解Update.Enter.Exit 与 添加.删除元素 在使用data()绑定数据时,例如:现在我们有一个数组[3,6,9,12,15],我们可以将数组每一项与一个<p>绑定,但是,现 ...

  4. buuoj刷题 October

    2019 极客大挑战 web easysql 直接万能密码登就完事了 LoveSQL 万能密码登进去,给了md5,没解出来 手注吧,都要忘了手注怎么注了 猜字段数 3的时候正常不报错 看回显位,2,3 ...

  5. 计算机网络-3-5-以太网MAC层及交换机

    MAC层的硬件地址 在局域网中,硬件地址又称为物理地址或者MAC地址(因为这种地址用在MAC帧中) IEEE 802标准为局域网规定了一种48位(6字节)的全球地址,固化在适配器的ROM中. 如果计算 ...

  6. 反射的妙用:C#通过反射动态生成类型继承接口并实现

    起因 最近想自己鼓捣个RPC,想着简化RPC调用方式,直接申明接口,然后根据接口的属性去配置RPC调用的相关信息.有一种说法叫申明式调用. 简单来说就是,申明一个interface,动态继承并实例化, ...

  7. 猿猿有责,维持整洁的 Git 提交记录,三个锦囊送给你

    背景 大家都有学习如何规范简洁的编写代码,但却很少学习如何规范简洁的提交代码.现在大家基本上都用 Git 作为源码管理的工具,Git 提供了极大的灵活性,我们按照各种 workflow 来提交/合并 ...

  8. 关于JAVA中顺序IO的基本操作

    关于JAVA中顺序IO的基本操作 写在前面 最近研究一下JAVA中的顺序IO,在网络上找了一会儿,发现少有详细的介绍,顾此在此处说说顺序IO,才学疏浅,如有不对,望赐教. 什么是顺序IO 事实上JAV ...

  9. [loj2978]杜老师

    假设所有素数从小到大依次为$p_{1},p_{2},...,p_{k}$,我们将$x$转换为一个$k$位的二进制数,其中从低到高第$i$位为1当且仅当其$p_{i}$的幂次为奇数 不难发现以下两个性质 ...

  10. uniapp增加自定义埋点功能

    起因 首先来说,uniapp其实是自带系统埋点统计功能的.基本也算是面面俱到. 但是一些未知原因,貌似数据有所丢失,再加上没有一些重要的定制化功能,以及最重要的数据安全方面的考虑,还是决定接入公司的埋 ...