iOS实现三屏复用循环广告[从服务器请求的广告]
循环广告我们在开发中已经是熟得不能再熟了,今天整理这篇scrollview三屏复用广告
原理使用scrollview里的三个imageview分别去加载不同的图片,用少量的资源来显示大量或不确定的广告数量,不然如果用普通方法实现广告,难道10个广告用12个scrollview的contentsize去做,岂不是太浪费资源了
代码如下,实现所有数量的循环广告,当广告只有一个时,仅采用单图显示,>=2个广告时,自动采用三屏复用
这里添加图片的方式是通过网络请求,更新服务器上的广告,如果仅使用本地广告,可以将.m文件里的全部图片的添加方式
如:
- self.endImageView.image = self.imageArray[endImageCount];
修改为
- self.endImageView.image = [UIImage imageNamed:self.imageArray[endImageCount]];
然后在使用该类时,直接将本地图片的名字用数组传过去就行了,如
- cview.imageArray = [[NSMutableArray alloc]initWithObjects:@"图片1",@"图片2",@"图片3", nil];
- 或者不改则使用方法如
NSArray *imageArr = [[NSArray alloc]initWithObjects:@"banner_理财.jpg",@"banner_惠普",@"banner_炒股", nil];
for (int i=0; i<3; i++) {
UIImage *cirImage1 = [UIImage imageNamed:imageArr[i]];
[cirScrollView.imageArray addObject:cirImage1];
}
如果图片给的是地址那可以用imageWithURL这个方法来获取图片
下面讲从服务器获取的广告方式,请求服务器图片及解析这里就不讲了,仅从获取到的data数据后开始
先新建一个类继承UIView,
.h里
- #import <UIKit/UIKit.h>
- @interface CirculateScrollview : UIView
- @property (nonatomic,strong)NSMutableArray *imageArray;//图片数组
- @property (nonatomic,strong)UIScrollView *circulateScrollView;//广告
- /*
- 三屏复用广告
- 适用范围:网络请求或固定本地的广告图片
- 适用所有数量广告,广告>=2时自动采用三屏复用技术
- 使用方法:例
- 在需要添加广告的控制器里面
- CirculateScrollview *cview = [[CirculateScrollview alloc]initWithFrame:CGRectMake(0, 20, 320, 200)];
- for (int i=0; i<3; i++) {
- UIImage *image = [UIImage imageNamed:@"旅行图1"];//传进图片名字方式
- //UIImage *image = UIImage imageWithData:data];//传进data数据图片方式将服务器请求到的data数据图片转换成image形式再传输
- [cview.imageArray addObject:image];
- }
- [self.view addSubview:cview];
- */
- /*
- 图片转换NSData方法
- 测试可用
- NSData * data = UIImageJPEGRepresentation(image, 1);
- */
- @end
.m文件里
实现方法是这三个成员变量,用来读取传输过来的图片在数组中的位置,三屏复用里,我们显示的位置是scrollview的中间位置,左边广告是全部广告的最后一个,中间显示第一个,右边的显示第二个,然后根据左滑成员变量递增,当变量递增到超过广告总数时,重新赋值第一个广告,而右滑递减,递减至-1时,即不在数组范围时,重新赋值广告数组的最后一个
- #import "CirculateScrollview.h"
- #define ViewWidth self.frame.size.width
- #define ViewHeight self.frame.size.height
- #define AllImageCount self.imageArray.count-1
- @interface CirculateScrollview()<UIScrollViewDelegate>
- {
- NSInteger endImageCount;//左边图片
- NSInteger oneImageCount;//中间图片[当前看到的图片]
- NSInteger secondImageCount;//右边图片
- }
- @property (nonatomic,strong)UIImageView *endImageView;
- @property (nonatomic,strong)UIImageView *oneImageView;
- @property (nonatomic,strong)UIImageView *secondImageView;
- @property (nonatomic,strong)UIPageControl *pageCtl;
- @end
- @implementation CirculateScrollview
- -(id)initWithFrame:(CGRect)frame
- {
- self = [super initWithFrame:frame];
- if (self) {
- }
- return self;
- }
- -(NSMutableArray *)imageArray
- {
- if (!_imageArray) {
- _imageArray = [[NSMutableArray alloc]init];
- }
- return _imageArray;
- }
- - (void)drawRect:(CGRect)rect {
- self.circulateScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(, , ViewWidth, ViewHeight)];
- endImageCount = self.imageArray.count-;
- oneImageCount = ;
- secondImageCount = ;
- self.circulateScrollView.showsHorizontalScrollIndicator = NO;
- self.circulateScrollView.pagingEnabled = YES;
- self.circulateScrollView.delegate = self;
- self.circulateScrollView.bounces = NO;
- self.circulateScrollView.contentOffset = CGPointMake(ViewWidth, );
- self.backgroundColor = [UIColor whiteColor];
- if (!self.imageArray.count) {
- NSLog(@"图片数组为空");
- return;
- }
- //若广告数量少于2张则不采用三屏复用技术
- if (self.imageArray.count<=){
- self.circulateScrollView.contentSize = CGSizeMake(ViewWidth, ViewHeight);
- self.endImageView = [[UIImageView alloc]initWithFrame:CGRectMake(, , ViewWidth, ViewHeight)];
- self.endImageView.image = self.imageArray[endImageCount];
- [self.circulateScrollView addSubview:self.endImageView];
- [self addSubview:self.circulateScrollView];
- }else{
- self.circulateScrollView.contentSize = CGSizeMake(ViewWidth*, ViewHeight);
- //左
- self.endImageView = [[UIImageView alloc]initWithFrame:CGRectMake(, , ViewWidth, ViewHeight)];
- self.endImageView.image = self.imageArray[endImageCount];
- [self.circulateScrollView addSubview:self.endImageView];
- //中
- self.oneImageView = [[UIImageView alloc]initWithFrame:CGRectMake(ViewWidth, , ViewWidth, ViewHeight)];
- self.oneImageView.image = self.imageArray[oneImageCount];
- [self.circulateScrollView addSubview:self.oneImageView];
- //右
- self.secondImageView = [[UIImageView alloc]initWithFrame:CGRectMake(ViewWidth*, , ViewWidth, ViewHeight)];
- self.secondImageView.image = self.imageArray[secondImageCount];
- [self.circulateScrollView addSubview:self.secondImageView];
- [self addSubview:self.circulateScrollView];
- [self pageNumControl];
- }
- }
- //添加页符
- -(void)pageNumControl
- {
- self.pageCtl = [[UIPageControl alloc]initWithFrame:CGRectMake(, ViewHeight-, ViewWidth, )];
- self.pageCtl.backgroundColor = [UIColor lightGrayColor];
- self.pageCtl.currentPageIndicatorTintColor = [UIColor greenColor];
- self.pageCtl.pageIndicatorTintColor = [UIColor whiteColor];
- self.pageCtl.alpha = 0.7;
- self.pageCtl.numberOfPages = AllImageCount+;
- [self addSubview:self.pageCtl];
- }
- -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
- {
- if (scrollView.contentOffset.x == ) {
- endImageCount--;
- oneImageCount--;
- secondImageCount--;
- if (endImageCount<) {
- endImageCount = AllImageCount;
- }else if (oneImageCount<){
- oneImageCount = AllImageCount;
- }
- //适配2张图片
- if (secondImageCount<){
- secondImageCount = AllImageCount;
- }
- //NSLog(@"endImageCount=%ld oneImageCount=%ld secondImageCount=%ld",endImageCount,oneImageCount,secondImageCount);
- }else if(scrollView.contentOffset.x == ViewWidth*){
- endImageCount++;
- oneImageCount++;
- secondImageCount++;
- if (endImageCount>AllImageCount) {
- endImageCount = ;
- }else if (oneImageCount>AllImageCount){
- oneImageCount = ;
- }
- //适配2张图片
- if (secondImageCount>AllImageCount){
- secondImageCount = ;
- }
- }
- //重新加载显示当前位置的图片
- scrollView.contentOffset = CGPointMake(ViewWidth, );
- self.endImageView.image = self.imageArray[endImageCount];
- self.oneImageView.image = self.imageArray[oneImageCount];
- self.secondImageView.image = self.imageArray[secondImageCount];
- self.pageCtl.currentPage = oneImageCount;
- }
- @end
iOS实现三屏复用循环广告[从服务器请求的广告]的更多相关文章
- iOS 的三种自建证书方法https请求相关配置
如果你的app服务端安装的是SLL颁发的CA,可以使用系统方法直接实现信任SSL证书,关于Apple对SSL证书的要求请参考:苹果官方文档CertKeyTrustProgGuide 这种方式不需要在B ...
- iOS回顾笔记(05) -- 手把手教你封装一个广告轮播图框架
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- Delphi IOS 蓝牙锁屏后台运行
Delphi IOS 后台运行 同样的程序,编译成android,锁屏后继续运行正常,蓝牙通讯正常,但在IOS下锁屏后程序的蓝牙就中断通讯了? IOS的机制就是这样,锁屏就关闭了. 音乐播放器是怎么做 ...
- iOS的三种多线程技术NSThread/NSOperation/GCD
1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心 ...
- Android 和 iOS 实现录屏推流的方案整理
一.录屏推流实现的步骤 1. 采集数据 主要是采集屏幕获得视频数据,采集麦克风获得音频数据,如果可以实现的话,我们还可以采集一些应用内置的音频数据. 2. 数据格式转换 主要是将获取到的视频和音频转换 ...
- iOS 9 分屏多任务:入门(中文版)
本文转载至 http://www.cocoachina.com/ios/20150714/12555.html 本文由钢铁侠般的卿哥(微博)翻译自苹果官方文档:Adopting Multitaskin ...
- iOS 实现启动屏动画(Swift实现,包含图片适配)
代码地址如下:http://www.demodashi.com/demo/12090.html 准备工作 首先我们需要确定作为宣传的图片的宽高比,这个一般是与 UI 确定的.一般启动屏展示会有上下两部 ...
- iOS开发三步搞定百度推送
iOS开发三步搞定百度推送 百度推送很简单,准备工作:在百度云推送平台注册应用,上传证书. 步骤一: 百度云推送平台 http://push.baidu.com/sdk/push_client_s ...
- ios手机录屏软件哪个好
苹果手机中的airplay镜像,是苹果手机系统的一大特色,可以轻松把手机屏幕投射电脑,这个功能使苹果手机相较安卓手机投屏会更加轻松,那么如何实现苹果手机投射电脑屏幕?下面小编便来分享ios手机录屏软件 ...
随机推荐
- bootstrap插件学习-bootstrap.tab.js
先看bootstrap-tab.js的结构 var Tab = function ( element ) {} //构造器 Tab.prototype ={} //构造器的原型 $.fn.tab = ...
- 伸展树(一)之 图文解析 和 C语言的实现
概要 本章介绍伸展树.它和"二叉查找树"和"AVL树"一样,都是特殊的二叉树.在了解了"二叉查找树"和"AVL树"之后, ...
- Java异步回调
作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 1.开始讲故事: 午饭的时候到了,可是天气太冷,根本不想出办公室的门,于是你拨通了某饭店的订餐电话“喂!你好 ...
- Android学习笔记之布局技巧以及布局中的细节介绍....
PS:休息两天,放一放手上的东西,做做总结... 学习内容: 1.Android中LinearLayout布局技巧... 2.layout中drawable属性的区别... 先简单的介绍一下dra ...
- 探秘重编译(Recompilations)(1/2)
这篇文章我想谈下SQL Server里一个非常重要的性能调优话题:重编译(Recompilations) .当你执行非常简单的存储过程(使用临时表)时,就会发生.今天我想奠定SQL Server里重编 ...
- IOS开发UI基础UITextView相关属性
UITextView相关属性 • text: 设置textView中文本_textView.text = @"Now is the time for all good develope ...
- 使用Spark分析拉勾网招聘信息(一):准备工作
本系列专属github地址:https://github.com/ios122/spark_lagou 前言 我觉得如果动笔,就应该努力地把要说的东西表达清楚.今后一段时间,尝试下系列博客文章.简单说 ...
- NOIP模拟赛-奶牛晒衣服(dry)
一.奶牛晒衣服(dry) [问题描述] 在熊大妈英明的带领下,时针和它的同伴生下了许多牛宝宝.熊大妈决定给每个宝宝都穿上可爱的婴儿装.于是,为牛宝宝洗晒衣服就成了很不爽的事情. 圣人王担负起了这个重任 ...
- C#开发的高性能EXCEL导入、导出工具DataPie(支持MSSQL、ORACLE、ACCESS,附源码下载地址)[转]
转自:http://www.cnblogs.com/yfl8910/archive/2012/05/19/2509194.html 作为财务数据核算人员,面对大量的业务与财务数据,借助于传统的EXCE ...
- Oracle基本操作汇总
--10g 新增的表空间类型:大文件 (Bigfile) 表空间.--10g 数据库在创建的时候,会指定默认的表空间类型.如果不特殊指定的话,默认为 SMALLFILE 类型的表空间.SELECT * ...