循环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. 面试官:能用JS写一个发布订阅模式吗?

    目录 1 场景引入 2 代码优化 2.1 解决增加粉丝问题 2.2 解决添加作品问题 3 观察者模式 4 经纪人登场 5 发布订阅模式 6 观察者模式和发布订阅模式的对比 什么是发布订阅模式?能手写实 ...

  2. 记录一次因subprocess PIPE 引起的线上故障

    sence:python中使用subprocess.Popen(cmd, stdout=sys.STDOUT, stderr=sys.STDERR, shell=True) ,stdout, stde ...

  3. robot_framewok自动化测试--(3)测试项目与测试套件的概念

    测试项目与测试套件的概念 如果你查看当前所创建的项目会发现,"test_project"是一个目录: "test_suit"则是一个 txt 文件: " ...

  4. shiro session返回问题

    /** * 3.会话管理器 */ public DefaultWebSessionManager sessionManager() { CustomSessionManager sessionMana ...

  5. Java 源码如何分析?

    如何阅读源码?万事开头难,源码从哪里开始看?我也是刚对源码的阅读研究不深,但是可以谈谈自己的源码阅读感受. 刚开始吧,只是对某些代码的实现原理感到好奇,好奇是怎么实现这种功能,实现这种效果的,对其背后 ...

  6. 手把手教你学Dapr - 9. 可观测性

    目录 手把手教你学Dapr - 1. .Net开发者的大时代 手把手教你学Dapr - 2. 必须知道的概念 手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序 手把手教你学Dapr ...

  7. 100_第一个vue-cli项目

    目录 什么是vue-cli 主要的功能 需要的环境 Node.js : http://nodejs.cn/download/ Git : https://git-scm.com/downloads 安 ...

  8. [atARC122F]Domination

    如果一个红石头在另一个红石头的左下方(包括左和下),那么在后者的限制满足时,前者也一定满足,因此可以删去前者,再将其按照$rx_{i}$排序,即有$rx_{1}<rx_{2}<...< ...

  9. 学习 NPM 最基础的指令

    什么是 NPM npm的核心是一个软件注册表(software registry). registry /ˈredʒɪstri/ n. 注册表:登记处:挂号处.注册表就像是信息登记表或者数据库. np ...

  10. Go语言核心36讲(Go语言实战与应用十七)--学习笔记

    39 | bytes包与字节串操作(下) 在上一篇文章中,我们分享了bytes.Buffer中已读计数的大致功用,并围绕着这个问题做了解析,下面我们来进行相关的知识扩展. 知识扩展 问题 1:byte ...