循环广告我们在开发中已经是熟得不能再熟了,今天整理这篇scrollview三屏复用广告

原理使用scrollview里的三个imageview分别去加载不同的图片,用少量的资源来显示大量或不确定的广告数量,不然如果用普通方法实现广告,难道10个广告用12个scrollview的contentsize去做,岂不是太浪费资源了

代码如下,实现所有数量的循环广告,当广告只有一个时,仅采用单图显示,>=2个广告时,自动采用三屏复用

这里添加图片的方式是通过网络请求,更新服务器上的广告,如果仅使用本地广告,可以将.m文件里的全部图片的添加方式

如:

  1. self.endImageView.image = self.imageArray[endImageCount];
    修改为
  1. self.endImageView.image = [UIImage imageNamed:self.imageArray[endImageCount]];
    然后在使用该类时,直接将本地图片的名字用数组传过去就行了,如
  1. cview.imageArray = [[NSMutableArray alloc]initWithObjects:@"图片1",@"图片2",@"图片3", nil];
  2.  
  3. 或者不改则使用方法如

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里

  1. #import <UIKit/UIKit.h>
  2.  
  3. @interface CirculateScrollview : UIView
  4.  
  5. @property (nonatomic,strong)NSMutableArray *imageArray;//图片数组
  6. @property (nonatomic,strong)UIScrollView *circulateScrollView;//广告
  7.  
  8. /*
  9. 三屏复用广告
  10. 适用范围:网络请求或固定本地的广告图片
  11. 适用所有数量广告,广告>=2时自动采用三屏复用技术
  12. 使用方法:例
  13. 在需要添加广告的控制器里面
  14.  
  15. CirculateScrollview *cview = [[CirculateScrollview alloc]initWithFrame:CGRectMake(0, 20, 320, 200)];
  16. for (int i=0; i<3; i++) {
  17. UIImage *image = [UIImage imageNamed:@"旅行图1"];//传进图片名字方式
  18. //UIImage *image = UIImage imageWithData:data];//传进data数据图片方式将服务器请求到的data数据图片转换成image形式再传输
  19. [cview.imageArray addObject:image];
  20. }
  21. [self.view addSubview:cview];
  22.  
  23. */
  24.  
  25. /*
  26. 图片转换NSData方法
  27. 测试可用
  28. NSData * data = UIImageJPEGRepresentation(image, 1);
  29. */
  30.  
  31. @end

.m文件里

实现方法是这三个成员变量,用来读取传输过来的图片在数组中的位置,三屏复用里,我们显示的位置是scrollview的中间位置,左边广告是全部广告的最后一个,中间显示第一个,右边的显示第二个,然后根据左滑成员变量递增,当变量递增到超过广告总数时,重新赋值第一个广告,而右滑递减,递减至-1时,即不在数组范围时,重新赋值广告数组的最后一个

  1. #import "CirculateScrollview.h"
  2.  
  3. #define ViewWidth self.frame.size.width
  4. #define ViewHeight self.frame.size.height
  5. #define AllImageCount self.imageArray.count-1
  6.  
  7. @interface CirculateScrollview()<UIScrollViewDelegate>
  8. {
  9. NSInteger endImageCount;//左边图片
  10. NSInteger oneImageCount;//中间图片[当前看到的图片]
  11. NSInteger secondImageCount;//右边图片
  12. }
  13. @property (nonatomic,strong)UIImageView *endImageView;
  14. @property (nonatomic,strong)UIImageView *oneImageView;
  15. @property (nonatomic,strong)UIImageView *secondImageView;
  16. @property (nonatomic,strong)UIPageControl *pageCtl;
  17.  
  18. @end
  19.  
  20. @implementation CirculateScrollview
  21.  
  22. -(id)initWithFrame:(CGRect)frame
  23. {
  24. self = [super initWithFrame:frame];
  25. if (self) {
  26.  
  27. }
  28. return self;
  29. }
  30.  
  31. -(NSMutableArray *)imageArray
  32. {
  33. if (!_imageArray) {
  34. _imageArray = [[NSMutableArray alloc]init];
  35. }
  36. return _imageArray;
  37. }
  38.  
  39. - (void)drawRect:(CGRect)rect {
  40. self.circulateScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(, , ViewWidth, ViewHeight)];
  41.  
  42. endImageCount = self.imageArray.count-;
  43. oneImageCount = ;
  44. secondImageCount = ;
  45.  
  46. self.circulateScrollView.showsHorizontalScrollIndicator = NO;
  47. self.circulateScrollView.pagingEnabled = YES;
  48. self.circulateScrollView.delegate = self;
  49. self.circulateScrollView.bounces = NO;
  50.  
  51. self.circulateScrollView.contentOffset = CGPointMake(ViewWidth, );
  52.  
  53. self.backgroundColor = [UIColor whiteColor];
  54.  
  55. if (!self.imageArray.count) {
  56. NSLog(@"图片数组为空");
  57. return;
  58. }
  59.  
  60. //若广告数量少于2张则不采用三屏复用技术
  61. if (self.imageArray.count<=){
  62. self.circulateScrollView.contentSize = CGSizeMake(ViewWidth, ViewHeight);
  63.  
  64. self.endImageView = [[UIImageView alloc]initWithFrame:CGRectMake(, , ViewWidth, ViewHeight)];
  65. self.endImageView.image = self.imageArray[endImageCount];
  66. [self.circulateScrollView addSubview:self.endImageView];
  67. [self addSubview:self.circulateScrollView];
  68.  
  69. }else{
  70. self.circulateScrollView.contentSize = CGSizeMake(ViewWidth*, ViewHeight);
  71.  
  72. //左
  73. self.endImageView = [[UIImageView alloc]initWithFrame:CGRectMake(, , ViewWidth, ViewHeight)];
  74. self.endImageView.image = self.imageArray[endImageCount];
  75. [self.circulateScrollView addSubview:self.endImageView];
  76. //中
  77. self.oneImageView = [[UIImageView alloc]initWithFrame:CGRectMake(ViewWidth, , ViewWidth, ViewHeight)];
  78. self.oneImageView.image = self.imageArray[oneImageCount];
  79. [self.circulateScrollView addSubview:self.oneImageView];
  80. //右
  81. self.secondImageView = [[UIImageView alloc]initWithFrame:CGRectMake(ViewWidth*, , ViewWidth, ViewHeight)];
  82. self.secondImageView.image = self.imageArray[secondImageCount];
  83. [self.circulateScrollView addSubview:self.secondImageView];
  84.  
  85. [self addSubview:self.circulateScrollView];
  86. [self pageNumControl];
  87. }
  88.  
  89. }
  90. //添加页符
  91. -(void)pageNumControl
  92. {
  93. self.pageCtl = [[UIPageControl alloc]initWithFrame:CGRectMake(, ViewHeight-, ViewWidth, )];
  94. self.pageCtl.backgroundColor = [UIColor lightGrayColor];
  95. self.pageCtl.currentPageIndicatorTintColor = [UIColor greenColor];
  96. self.pageCtl.pageIndicatorTintColor = [UIColor whiteColor];
  97. self.pageCtl.alpha = 0.7;
  98. self.pageCtl.numberOfPages = AllImageCount+;
  99. [self addSubview:self.pageCtl];
  100. }
  101.  
  102. -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
  103. {
  104. if (scrollView.contentOffset.x == ) {
  105. endImageCount--;
  106. oneImageCount--;
  107. secondImageCount--;
  108. if (endImageCount<) {
  109. endImageCount = AllImageCount;
  110. }else if (oneImageCount<){
  111. oneImageCount = AllImageCount;
  112. }
  113. //适配2张图片
  114. if (secondImageCount<){
  115. secondImageCount = AllImageCount;
  116. }
  117. //NSLog(@"endImageCount=%ld oneImageCount=%ld secondImageCount=%ld",endImageCount,oneImageCount,secondImageCount);
  118.  
  119. }else if(scrollView.contentOffset.x == ViewWidth*){
  120. endImageCount++;
  121. oneImageCount++;
  122. secondImageCount++;
  123. if (endImageCount>AllImageCount) {
  124. endImageCount = ;
  125. }else if (oneImageCount>AllImageCount){
  126. oneImageCount = ;
  127. }
  128. //适配2张图片
  129. if (secondImageCount>AllImageCount){
  130. secondImageCount = ;
  131. }
  132. }
  133. //重新加载显示当前位置的图片
  134. scrollView.contentOffset = CGPointMake(ViewWidth, );
  135. self.endImageView.image = self.imageArray[endImageCount];
  136. self.oneImageView.image = self.imageArray[oneImageCount];
  137. self.secondImageView.image = self.imageArray[secondImageCount];
  138. self.pageCtl.currentPage = oneImageCount;
  139. }
  140.  
  141. @end

iOS实现三屏复用循环广告[从服务器请求的广告]的更多相关文章

  1. iOS 的三种自建证书方法https请求相关配置

    如果你的app服务端安装的是SLL颁发的CA,可以使用系统方法直接实现信任SSL证书,关于Apple对SSL证书的要求请参考:苹果官方文档CertKeyTrustProgGuide 这种方式不需要在B ...

  2. iOS回顾笔记(05) -- 手把手教你封装一个广告轮播图框架

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  3. Delphi IOS 蓝牙锁屏后台运行

    Delphi IOS 后台运行 同样的程序,编译成android,锁屏后继续运行正常,蓝牙通讯正常,但在IOS下锁屏后程序的蓝牙就中断通讯了? IOS的机制就是这样,锁屏就关闭了. 音乐播放器是怎么做 ...

  4. iOS的三种多线程技术NSThread/NSOperation/GCD

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心 ...

  5. Android 和 iOS 实现录屏推流的方案整理

    一.录屏推流实现的步骤 1. 采集数据 主要是采集屏幕获得视频数据,采集麦克风获得音频数据,如果可以实现的话,我们还可以采集一些应用内置的音频数据. 2. 数据格式转换 主要是将获取到的视频和音频转换 ...

  6. iOS 9 分屏多任务:入门(中文版)

    本文转载至 http://www.cocoachina.com/ios/20150714/12555.html 本文由钢铁侠般的卿哥(微博)翻译自苹果官方文档:Adopting Multitaskin ...

  7. iOS 实现启动屏动画(Swift实现,包含图片适配)

    代码地址如下:http://www.demodashi.com/demo/12090.html 准备工作 首先我们需要确定作为宣传的图片的宽高比,这个一般是与 UI 确定的.一般启动屏展示会有上下两部 ...

  8. iOS开发三步搞定百度推送

    iOS开发三步搞定百度推送   百度推送很简单,准备工作:在百度云推送平台注册应用,上传证书. 步骤一: 百度云推送平台 http://push.baidu.com/sdk/push_client_s ...

  9. ios手机录屏软件哪个好

    苹果手机中的airplay镜像,是苹果手机系统的一大特色,可以轻松把手机屏幕投射电脑,这个功能使苹果手机相较安卓手机投屏会更加轻松,那么如何实现苹果手机投射电脑屏幕?下面小编便来分享ios手机录屏软件 ...

随机推荐

  1. bootstrap插件学习-bootstrap.tab.js

    先看bootstrap-tab.js的结构 var Tab = function ( element ) {} //构造器 Tab.prototype ={} //构造器的原型 $.fn.tab = ...

  2. 伸展树(一)之 图文解析 和 C语言的实现

    概要 本章介绍伸展树.它和"二叉查找树"和"AVL树"一样,都是特殊的二叉树.在了解了"二叉查找树"和"AVL树"之后, ...

  3. Java异步回调

      作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 1.开始讲故事: 午饭的时候到了,可是天气太冷,根本不想出办公室的门,于是你拨通了某饭店的订餐电话“喂!你好 ...

  4. Android学习笔记之布局技巧以及布局中的细节介绍....

    PS:休息两天,放一放手上的东西,做做总结... 学习内容: 1.Android中LinearLayout布局技巧... 2.layout中drawable属性的区别...   先简单的介绍一下dra ...

  5. 探秘重编译(Recompilations)(1/2)

    这篇文章我想谈下SQL Server里一个非常重要的性能调优话题:重编译(Recompilations) .当你执行非常简单的存储过程(使用临时表)时,就会发生.今天我想奠定SQL Server里重编 ...

  6. IOS开发UI基础UITextView相关属性

    UITextView相关属性 •    text: 设置textView中文本_textView.text = @"Now is the time for all good develope ...

  7. 使用Spark分析拉勾网招聘信息(一):准备工作

    本系列专属github地址:https://github.com/ios122/spark_lagou 前言 我觉得如果动笔,就应该努力地把要说的东西表达清楚.今后一段时间,尝试下系列博客文章.简单说 ...

  8. NOIP模拟赛-奶牛晒衣服(dry)

    一.奶牛晒衣服(dry) [问题描述] 在熊大妈英明的带领下,时针和它的同伴生下了许多牛宝宝.熊大妈决定给每个宝宝都穿上可爱的婴儿装.于是,为牛宝宝洗晒衣服就成了很不爽的事情. 圣人王担负起了这个重任 ...

  9. C#开发的高性能EXCEL导入、导出工具DataPie(支持MSSQL、ORACLE、ACCESS,附源码下载地址)[转]

    转自:http://www.cnblogs.com/yfl8910/archive/2012/05/19/2509194.html 作为财务数据核算人员,面对大量的业务与财务数据,借助于传统的EXCE ...

  10. Oracle基本操作汇总

    --10g 新增的表空间类型:大文件 (Bigfile) 表空间.--10g 数据库在创建的时候,会指定默认的表空间类型.如果不特殊指定的话,默认为 SMALLFILE 类型的表空间.SELECT * ...