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
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...