iOS實現三屏復用迴圈廣告

来源:http://www.cnblogs.com/fcug/archive/2016/02/16/5192074.html
-Advertisement-
Play Games

迴圈廣告我們在開發中已經是熟得不能再熟了,今天整理這篇scrollview三屏復用廣告 原理使用scrollview里的三個imageview分別去載入不同的圖片,用少量的資源來顯示大量或不確定的廣告數量,不然如果用普通方法實現廣告,難道10個廣告用12個scrollview的contentsize


迴圈廣告我們在開發中已經是熟得不能再熟了,今天整理這篇scrollview三屏復用廣告

原理使用scrollview里的三個imageview分別去載入不同的圖片,用少量的資源來顯示大量或不確定的廣告數量,不然如果用普通方法實現廣告,難道10個廣告用12個scrollview的contentsize去做,豈不是太浪費資源了

代碼如下,實現所有數量的迴圈廣告,當廣告只有一個時,僅採用單圖顯示,>=2個廣告時,自動採用三屏復用

先新建一個類繼承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數據圖片方式
19  [cview.imageArray addObject:image];
20  }
21  [self.view addSubview:cview];
22  
23  */
24 
25 
26 /*
27  圖片轉換NSData方法
28  測試可用
29  NSData * data = UIImageJPEGRepresentation(image, 1);
30  */
31 
32 @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 
 23 -(id)initWithFrame:(CGRect)frame
 24 {
 25     self = [super initWithFrame:frame];
 26     if (self) {
 27         
 28     }
 29     return self;
 30 }
 31 
 32 -(NSMutableArray *)imageArray
 33 {
 34     if (!_imageArray) {
 35         _imageArray = [[NSMutableArray alloc]init];
 36     }
 37     return _imageArray;
 38 }
 39 
 40 - (void)drawRect:(CGRect)rect {
 41     self.circulateScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, ViewWidth, ViewHeight)];
 42     
 43     endImageCount = self.imageArray.count-1;
 44     oneImageCount = 0;
 45     secondImageCount = 1;
 46     
 47     self.circulateScrollView.showsHorizontalScrollIndicator = NO;
 48     self.circulateScrollView.pagingEnabled = YES;
 49     self.circulateScrollView.delegate = self;
 50     self.circulateScrollView.bounces = NO;
 51     
 52     self.circulateScrollView.contentOffset = CGPointMake(ViewWidth, 0);
 53     
 54     self.backgroundColor = [UIColor whiteColor];
 55     
 56     if (!self.imageArray.count) {
 57         NSLog(@"圖片數組為空");
 58         return;
 59     }
 60     
 61     
 62     //若廣告數量少於2張則不採用三屏復用技術
 63     if (self.imageArray.count<=1){
 64         self.circulateScrollView.contentSize = CGSizeMake(ViewWidth, ViewHeight);
 65         
 66         self.endImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, ViewWidth, ViewHeight)];
 67         self.endImageView.image = self.imageArray[endImageCount];
 68         [self.circulateScrollView addSubview:self.endImageView];
 69         [self addSubview:self.circulateScrollView];
 70         
 71     }else{
 72         self.circulateScrollView.contentSize = CGSizeMake(ViewWidth*3, ViewHeight);
 73         
 74         //
 75         self.endImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, ViewWidth, ViewHeight)];
 76         self.endImageView.image = self.imageArray[endImageCount];
 77         [self.circulateScrollView addSubview:self.endImageView];
 78         //
 79         self.oneImageView = [[UIImageView alloc]initWithFrame:CGRectMake(ViewWidth, 0, ViewWidth, ViewHeight)];
 80         self.oneImageView.image = self.imageArray[oneImageCount];
 81         [self.circulateScrollView addSubview:self.oneImageView];
 82         //
 83         self.secondImageView = [[UIImageView alloc]initWithFrame:CGRectMake(ViewWidth*2, 0, ViewWidth, ViewHeight)];
 84         self.secondImageView.image = self.imageArray[secondImageCount];
 85         [self.circulateScrollView addSubview:self.secondImageView];
 86         
 87         
 88         [self addSubview:self.circulateScrollView];
 89         [self pageNumControl];
 90     }
 91 
 92 }
 93 
 94 -(void)pageNumControl
 95 {
 96     self.pageCtl = [[UIPageControl alloc]initWithFrame:CGRectMake(0, ViewHeight-20, ViewWidth, 20)];
 97     self.pageCtl.backgroundColor = [UIColor lightGrayColor];
 98     self.pageCtl.currentPageIndicatorTintColor = [UIColor greenColor];
 99     self.pageCtl.pageIndicatorTintColor = [UIColor whiteColor];
100     self.pageCtl.alpha = 0.7;
101     self.pageCtl.numberOfPages = AllImageCount+1;
102     [self addSubview:self.pageCtl];
103 }
104 
105 -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
106 {
107     if (scrollView.contentOffset.x == 0) {
108         endImageCount--;
109         oneImageCount--;
110         secondImageCount--;
111         if (endImageCount<0) {
112             endImageCount = AllImageCount;
113         }else if (oneImageCount<0){
114             oneImageCount = AllImageCount;
115         }
116         //適配2張圖片
117         if (secondImageCount<0){
118             secondImageCount = AllImageCount;
119         }
120         //NSLog(@"endImageCount=%ld  oneImageCount=%ld  secondImageCount=%ld",endImageCount,oneImageCount,secondImageCount);
121         scrollView.contentOffset = CGPointMake(ViewWidth, 0);
122         self.endImageView.image = self.imageArray[endImageCount];
123         self.oneImageView.image = self.imageArray[oneImageCount];
124         self.secondImageView.image = self.imageArray[secondImageCount];
125     }else if(scrollView.contentOffset.x == ViewWidth*2){
126         endImageCount++;
127         oneImageCount++;
128         secondImageCount++;
129         if (endImageCount>AllImageCount) {
130             endImageCount = 0;
131         }else if (oneImageCount>AllImageCount){
132             oneImageCount = 0;
133         }
134         //適配2張圖片
135         if (secondImageCount>AllImageCount){
136             secondImageCount = 0;
137         }
138         scrollView.contentOffset = CGPointMake(ViewWidth, 0);
139         self.endImageView.image = self.imageArray[endImageCount];
140         self.secondImageView.image = self.imageArray[secondImageCount];
141         self.oneImageView.image = self.imageArray[oneImageCount];
142     }
143     self.pageCtl.currentPage = oneImageCount;
144 }
145 
146 @end

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在開始前我們在這先附一段最簡單的代碼 - (void)viewDidLoad { [super viewDidLoad]; UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; UICollec
  • 開通博客以來已經約莫1個月了。幾次想提筆寫寫東西,但總是由於各種各樣的原因並沒有開始。現在,年假剛結束,項目也還沒有開始,但最終促使我寫這篇博客的是,看了一篇博友寫的新年計劃,說是要在新的一年中寫50篇博客,我也心血來潮的定下了這樣的目標。把年前項目中用到的FragmentTabHost在這裡總結一
  • 需求:在一個數組裡面,將在這個數組中的並且在另一個數組裡面的元素過濾掉。 即:在一個數組dataArray裡面,將在dataArray數組中的並且在filteredArray數組裡面的元素過濾掉。 //iOS-篩選數組內的元素 //在dataArray中裡面,將在dataArray中的並且在filt
  • 今天早上同事說咱們的證書無法使用了,顯示“此證書的簽發者無效”。一開始以為誰誤操作了證書,查看後發現所有證書都無效了。查了會才發下原來是Apple Worldwide Developer Relations Certification Authority Intermediate Certifica
  • 嗷嗚嗷嗚嗷嗚 1 // 將視圖作為屬性方便後面執行多個不同動畫 2 _myView = [[UIView alloc] init]; 3 _myView.layer.position = CGPointMake(100, 100); 4 _myView.layer.bounds = CGRectMa
  • 今天用Xcode打包IPA文件給同事,結果提示import時,提示證書missing,找了半天沒發現問題,後來打開鑰匙串,發現證書全失效了!!!嚇死寶寶了~~~~(>_<)~~~~ 然後,處理它。 1.打開鑰匙串 2.進行如下圖操作,打開證書信息雙擊或右鍵均可 3.再次去打包,成功 註意:分享轉載請
  • Moshi 是一個現代化的JSON庫針對Android和Java。它可以很容易地解析JSON成Java對象: String json = ...; Moshi moshi = new Moshi.Builder().build(); JsonAdapter<BlackjackHand> jsonAd
  • 自定義視圖,視圖控制器,視圖控制器指定視圖,loadView,viewDidLoad,MVC,屏幕旋轉,記憶體警告
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...