圖片輪播器 是一個在應用中使用率非常高的控制項,翻了一遍手機上的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張圖片。感覺有點亂?……