BLCycleImageView---”一個神奇的”圖片輪播器

来源:http://www.cnblogs.com/busylife/archive/2016/12/16/6186602.html
-Advertisement-
Play Games

     圖片輪播器 是一個在應用中使用率非常高的控制項,翻了一遍手機上的app,發現幾乎所有的應用中都不乏圖片輪播的身影。醒目、美觀、信息直面撲來等等特點使得輪播器成了app展示信息的首選。     其實在github上 ...




    圖片輪播器是一個在應用中使用率非常高的控制項,翻了一遍手機上的app,發現幾乎所有的應用中都不乏圖片輪播的身影。醒目、美觀、信息直面撲來等等特點使得輪播器成了app展示信息的首選。

    其實在github上搜一下可以找到一些優秀的第三方庫,比如star較高的 SDCycleScrollView。抱著學習的態度,沒有去查看它的源代碼,想著自己要是實現一個該怎麼做呢?立馬動手擼一個,才有了自己的輪播器BLCycleImageView。下麵講大概講一下在擼的整個過程中思路和收穫,希望對各位看官有所幫助(特別是像我一樣剛入門但愛折騰的小白)。



一、前期思考準備

    封裝一個控制項前先需要搞明白這幾個問題:

  • 這個控制項能幹啥,大概長什麼樣子?
  • 它需要外部哪些信息?
  • 它向外反饋什麼信息?
  • 選型;使用何種技術實現,在這裡就是以什麼為父類?

    輪播器長啥樣?

    隨便打開幾個常用的應用看看就知道了(iphone上的App Store首頁就有);功能無非是顯示若幹圖片、顯示當前圖片是第幾張(pagecontroll)、能夠左右滑動、能夠自動輪播、顯示圖片描述以及圖片緩存等等。



    輪播器要知道哪些信息呢?

    輪播一般是放置類似廣告之類的信息,每個時間段投放的廣告會不一樣,這樣就需要接收外部給我的一組圖片地址

@property(nonatomic,copy)  NSArray *imageUrlArr;

    那麼非同步載入這些圖片時,難免會碰到網路糟糕的時候,那麼這個時候需要一個顯示預設的圖片。(圖片緩存採用第三方庫SDWebImage)

@property(nonatomic,strong) UIImage *placeholderImg;

    上面是一個輪播器最基本必須的信息,有了這些信息,輪播器就可以工作了。

    但為了更好的擴展性和定製性,我們還有需要知道很多信息,比如:每張圖片需要一個簡短的“廣告語”、是否顯示pagecontroll、是否自動輪播、自動輪播間隔時間等等。不一一列舉,具體看下麵代碼:

@property(nonatomic,copy) NSArray *imageTitles;//圖片描述
@property(nonatomic,getter=isShowPageControll) BOOL showPageControll;
@property(nonatomic,getter=isAutoMoving) BOOL autoMoving;//是否自動輪播
@property(nonatomic,assign) NSNumber *autoMoveInterval;//輪播間隔時間
@property(nonatomic,assign) PageControllPositionType pagecontrollPosition;//圖片描述位置

    暫時只想到這麼多了,這樣它就有很好的定製性了,以能滿足不同的需求。



    輪播器反饋哪些信息呢?

    當你看到輪播器中一個著裝很暴露的漂亮妹子,你是否想點擊一下期待看一下大圖呢,然後放大,再放大,再放大點呢?哈哈暴露了自己的想法,主要是審美……。 那麼就需要響應用戶的點擊圖片的事件:

@protocol CycleImageViewDelegate <NSObject>

@optional
- (void)cycleImageView:(BLCycleImageView *)cycleImageView didClickImage:(NSUInteger)imageIndex;

@end

    到這裡一個功能較為完善的輪播器就基本構建起來了,結下來的就是要考慮怎麼去實現了。那麼就馬上動手編碼?先等等。


    用什麼來輪播器呢?

    考慮一下iOS的那些基礎控制項能實現輪播器呢?很自然的就想到三個:

  • UIPageViewController
  • UICollectionView
  • UIScrollView

    其實無論用哪種方式實現都是可以,但個人覺得後兩種更合適封裝成獨立的控制項,理由很簡單,試想將一個controller添加到另外一個controller(subviewcontroller)不是不可以,總覺得怪怪的。至於是用UICollenctionView還是UIScrollView就看各位自己熟悉哪個了。這裡BLCycleImageView選擇用UIScrollView來實現。

    還有一個問題,怎麼實現無限輪播呢?常見有兩種做法:

  • 1、N+2的方式;實現原理是當需要輪播N張圖片,我們在首尾再加兩張圖片,在首部加一張圖片為第N張,尾部加一張圖片為第1張圖片。感覺有點亂?……
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ...
  • 原型設計模式: 用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。 原型設計模式簡單的來說,顧名思義, 不去創建新的對象進而保留原型的一種設計模式。 缺點:原型設計模式是的最主要的缺點就是這個克隆方法需要對類的功能進行檢測,這對於全新的類來說較容易,但對已有的類進行改造時將不是件容易的 ...
  • 轉自:http://www.jb51.net/article/42671.htm 在開始之前先說一點,DOM是非常容易理解的,但是大家說的太官方,讓人很是難於理解,我們就用非常簡單的語言翻譯一遍。加深對DOM的理解,從而對它有一個全面的認識。 什麼是DOM DOM的全稱是Document Objec ...
  • 謹記(指定選擇器Intent.createChooser()) 開始今天的內容前,先閑聊一下: (1)突然有一天頭腦風暴,對很多問題有了新的看法和見解,迫不及待的想要分享給大家,文檔已經寫好了,我需要通過微信或者QQ,簡訊等社交工具發送給大家。 (2)在網上發現一段特別好的文章,想要保存收藏下來。 ...
  • 谷歌並沒有給出沉浸式狀態欄這個概念,谷歌只說了沉浸式模式(Immersive Mode)。 ...
  • ionic第二坑——ionic 上拉菜單(ActionSheet)安卓樣式坑 ...
  • 最近有個需求,需要做兩個功能相似的APP,大部分代碼是一樣的,只是界面不一樣,以前要維護兩套代碼,比較麻煩,最近在網上找資料,發現可以用gradle使用同一套代碼構建兩個APP。下麵介紹使用方法: 首先要構建兩個APP需要有兩個APP圖標、APP名字和AndroidManifest.xml。Andr ...
  • 本期內容包括: 開發一個自定義View併發布為開源庫的完整流程介紹; 用`AnimatedVectorDrawable`實現的動畫; 什麼樣的程式是可測試的; `DownloadManager`介紹; Okhttp的重試; Android 7取消了`file://`; Android Studio即... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...