UIScrollView迴圈滾動1

来源:http://www.cnblogs.com/wolfhous/archive/2016/06/13/5579998.html
-Advertisement-
Play Games

現在基本每一個商業APP都會有迴圈滾動視圖,放一些輪播廣告之類的,都是放在UIScrollView之上。假如我要實現N張圖片的輪播,我借鑒了幾個博文,得到兩種方法實現: 【第一種】:如下圖(圖片來源於kenshin cui‘s的博客),假如要實現3張圖片輪播,我們就設置UIScrollView上的i ...


現在基本每一個商業APP都會有迴圈滾動視圖,放一些輪播廣告之類的,都是放在UIScrollView之上。假如我要實現N張圖片的輪播,我借鑒了幾個博文,得到兩種方法實現:

【第一種】:如下圖(圖片來源於kenshin cui‘s的博客),假如要實現3張圖片輪播,我們就設置UIScrollView上的imageView為3+2個,圖片順序為31231。

初始載入UIScrollView時候,滾動到第二個imageView上。

當滾動到最後一個imageview時候,設置UIScrollView的ContentOffset到第二個imageView。

當往前滾動到第一個imageview時候,設置UIScrollView的ContentOffset到倒數第二個imageview。

具體代碼如下:

 1 #import "ViewController.h"
 2 //定義巨集,獲取屏幕寬高
 3 #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
 4 #define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height
 5 
 6 @interface ViewController ()<UIScrollViewDelegate>
 7 /** 滾動視圖*/
 8 @property (nonatomic,strong)UIScrollView *scrollView;
 9 /** 圖片數組*/
10 @property (nonatomic,strong)NSMutableArray *imageArray;
11 @end
12 
13 @implementation ViewController
14 //懶載入滾動視圖
15 -(UIScrollView *)scrollView{
16     if (!_scrollView) {
17         _scrollView = [[UIScrollView alloc]init];
18     }
19     return _scrollView;
20 }
21 //懶載入圖片數組
22 -(NSMutableArray *)imageArray{
23     if (!_imageArray) {
24         _imageArray = [NSMutableArray array];
25     }
26     return _imageArray;
27 }
28 
29 
30 - (void)viewDidLoad {
31     [super viewDidLoad];
32     //先載入圖片
33     [self loadImageArray];
34     //再設置滾動視圖
35     [self setupScrollview];
36 }
37 //載入圖片,假設有3張圖片 welcome1 welcome2 welcome3
38 -(void)loadImageArray{
39     for (NSInteger i = 0 ; i<3; i++) {
40         UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"welcome%ld",i+1]];
41         [self.imageArray addObject:image];
42     }
43 }
44 //設置scrollview
45 -(void)setupScrollview{
46     //設置可見區域
47     self.scrollView.frame = self.view.bounds;
48     //設置容量
49     self.scrollView.contentSize = CGSizeMake(SCREEN_WIDTH*(self.imageArray.count + 2), SCREEN_HEIGHT);
50     //翻頁模式
51     self.scrollView.pagingEnabled = YES;
52     //代理
53     self.scrollView.delegate = self;
54     //邊緣不能彈跳
55     self.scrollView.bounces = NO;
56     //隱藏水平滾動條
57     self.scrollView.showsHorizontalScrollIndicator = NO;
58     [self.view addSubview:self.scrollView];
59     //迴圈添加imageView
60     for (NSInteger i = 0; i < self.imageArray.count + 2; i++) {
61         UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(i *SCREEN_WIDTH, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
62         if (i == 0) {//0->lastObject
63             imageView.image = self.imageArray.lastObject;
64         }else if (i == self.imageArray.count + 1){//4->firstObject
65             imageView.image = self.imageArray.firstObject;
66         }else{//1->0 2->1 3->2
67             imageView.image = self.imageArray[i-1];
68         }
69         [self.scrollView addSubview:imageView];
70     }
71     //設置初始滾動的位置為第二個imageView
72     self.scrollView.contentOffset = CGPointMake(SCREEN_WIDTH, 0);
73 }
74 //當停止滾動時候,重新設置 scrollview的ContentOffset
75 -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
76     CGPoint point = scrollView.contentOffset;
77     if (point.x/SCREEN_WIDTH > self.imageArray.count) {//當滾動到最後的時候
78         [self.scrollView setContentOffset:CGPointMake(SCREEN_WIDTH, 0) animated:NO];
79     }else if (point.x/SCREEN_WIDTH < 1){//當滾動到最前的時候
80         [self.scrollView setContentOffset:CGPointMake(SCREEN_WIDTH*self.imageArray.count, 0) animated:NO];
81     }
82 }

可以新建項目,直接複製該代碼,在loadImageArray方法裡面修改成載入自己的圖片,運行即可。

【第二種】:假如有100張圖片或者更多,就得載入100+2個imageview,顯然對性能要求就得更高,因此衍生出了第二種。

就是無論你有多少張圖片,imageview始終只有3個。

無論你怎麼滾動,當滾動完畢的時候,UIScrollView的ContentOffset都是中間的一個imageview。

只是我們在UIScrollView的代理方法裡面不斷改變每一個imageview.image的圖片而已。

第二種源碼我會在後續博文補充。

其實,這個迴圈滾動學的不是會敲代碼,而是一種思路。

最後推薦一個github很好用的類似第三方類庫SDCycleScrollView,星星兩千多,很不錯。


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

-Advertisement-
Play Games
更多相關文章
  • 今天小微開店寶在測試環境發佈更新的時候,同事問:“**為什麼我需要手動清理瀏覽器緩存才能看到變更?難道系統上線後也需要客戶自己清理瀏覽器緩存嗎!”看來,這個坑需要我來填了。 ...
  • 馬上學Android開發視頻教程全集 馬上學Android開發[馬上學Android]安卓開發視頻教程 001 Androi 馬上學Android開發[馬上學Android]安卓開發視頻教程 002 開發環 馬上學Android開發[馬上學Android]安卓開發視頻教程 003 Androi 馬上 ...
  • 在開發過程中,隨著項目的迭代,文件內部分import 可能早已經不用了,對於這種無用的 import,我們不可能一個一個文件的刪除。這裡記錄個自動刪除無用import的功能。 一 、開發環境: Android Studio 1.5 二、方法/步驟 1.啟動Android Studio,打開項目,可以 ...
  • 這是一款基於安卓的打地鼠游戲,界面簡潔,有level模式打地鼠和無盡模式打地鼠兩種游戲模式,並可以通過商店使用金幣進行道具的購買,道具可以讓你更容易通關;同時金幣可以在游戲通關的時候獲取。工程中有較為詳細的註釋說明,可以供你參考學習。項目中使用了自定義動畫和資料庫操作。 部分實行代碼: /** * ...
  • 一般我們提示的時候都是直接提示文字的,其實Toast也可以顯示圖片 方法 例子 1.只顯示圖片的Toast 2.顯示圖片和文字 ...
  • ...
  • RDVTabBarController這個庫寫得相當不錯,所以今天就簡單介紹下它的基本使用,看裡面可以清楚的知道代碼規範的重要性,這個庫的使用方法和官方的相識 下載地址:https://github.com/robbdimitrov/RDVTabBarController 首先寫過控制器繼承 RDV ...
  • 項目地址: https://github.com/hwding/AeolosXDUWidget 求支持(╭ ̄3 ̄)╭♡ 本小白所在的學校雖身為某某電子科技大學, 但是網路基礎設施實在是...用於查詢的各個網頁根本用的不是一套系統...也就是說, 如果你想很方便地獲取你的實驗成績\體育打卡次數\校內一 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...