iOS開發(fā)-基于collectionView實現(xiàn)的通用無限輪播圖banner封裝.

CWCarousel

基于collectionView實現(xiàn)的通用無限輪播圖封裝.

  1. issues里面的可以重現(xiàn)的問題已經(jīng)修復(fù).
  2. 部分不能重現(xiàn)的問題暫未處理.
  3. 請大家提issue盡量描述詳細(xì)些,最好能提供代碼或者截圖.請附上是OC版本還是Swift版本的問題.
  4. 謝謝配合,大家一起進(jìn)步.
  5. 代碼示例為oc代碼, 項目中已有swift版本,請自行下載.
  6. oc版本支持cocoaPods安裝 pod search OC_CWCarousel

oc版和swift是兩份完全不同的代碼昔案,所以代碼實現(xiàn)不盡相同尿贫。有些可能在其中一個版本實現(xiàn)了,但是另一個版本不一定來得及實現(xiàn)爱沟。請參照下面的版本記錄自行了解:

OC:版本記錄

版本號 更新內(nèi)容
1.1.9 1帅霜、采用 NSTimer + NSProxy方式實現(xiàn)自動輪播匆背,外部可以無需再手動調(diào)用releaseTimer方法來釋放內(nèi)存了呼伸。<br /> 2、優(yōu)化了scrollToIndex內(nèi)部實現(xiàn) <br /> 3、修改pageControl布局代理的觸發(fā)邏輯
1.1.8 1. 代碼重構(gòu)括享。<br />2. 計算間距算法修改搂根,更好更簡單的設(shè)置間距。<br />3. 新增代理回調(diào):- (void)CWCarousel:(CWCarousel*)carousel addPageControl:(UIView* )pageControl;可以在該回調(diào)中自定義布局pageControl铃辖。<br />4. 新增滾動到指定位置方法:- (void*scrollTo:(NSInteger)index animation:(BOOL)animation;剩愧。<br />5. 廢棄了maxScale屬性。<br />6.優(yōu)化了自定義pageControl的實現(xiàn)娇斩。<br />7.修改了演示demo首頁樣式和邏輯仁卷。
1.1.7 適配iOS14 感謝milletZZ
1.1.5 1.新增了2個代理回調(diào)
2.點擊事件代理回調(diào)邏輯優(yōu)化
1.1.4 修復(fù)樣式3在320尺寸屏幕上可能出現(xiàn)的問題
1.1.3 提升了一個版本號
1.1.2 控件優(yōu)化
1.1.1 添加了無限輪播功能開關(guān) endless
1.1.0 修復(fù)了之前的一些bug

swift:版本記錄

版本號 更新內(nèi)容
1.1.9 1、代碼重構(gòu) 2犬第、timer實現(xiàn)方式優(yōu)化锦积,外部無需手動調(diào)用releaseTimer釋放內(nèi)存 3、計算間距算法修改歉嗓,更好更簡單的設(shè)置間距 4丰介、新增滾動到指定位置方法
1.1.8 1.fix bug,2. 自定義pageControl優(yōu)化鉴分, 3.只有一張圖時不可無限滑動哮幢, 4.無數(shù)據(jù)時可以設(shè)置占位視圖
1.1.7 適配iOS14 感謝milletZZ
1.1.4 修復(fù)通過layout創(chuàng)建視圖,偶現(xiàn)不自動輪播問題.
1.1.3 適配swift5.0
1.1.2 修復(fù)樣式3在320尺寸屏幕上可能出現(xiàn)的問題
1.1.1 添加了無限輪播功能開關(guān) endless
1.1.0 功能同OC版 1.1.0

example.gif
  • 目前支持4種樣式
typedef NS_ENUM(NSUInteger, CWCarouselStyle) {
CWCarouselStyle_Unknow = 0,     ///<未知樣式
CWCarouselStyle_Normal,         ///<普通樣式,一張圖占用整個屏幕寬度
CWCarouselStyle_H_1,            ///<自定義樣式一, 中間一張居中,前后2張圖有部分內(nèi)容在屏幕內(nèi)可以預(yù)覽到
CWCarouselStyle_H_2,            ///<自定義樣式二, 中間一張居中,前后2張圖有部分內(nèi)容在屏幕內(nèi)可以預(yù)覽到,并且中間一張圖正常大小,前后2張圖會縮放
CWCarouselStyle_H_3,            ///<自定義樣式三, 中間一張居中,前后2張圖有部分內(nèi)容在屏幕內(nèi)可以預(yù)覽到,中間一張有放大效果,前后2張正常大小
};

CWCarouselStyle_Normal


normal.gif

CWCarouselStyle_H_1


H_1.gif

CWCarouselStyle_H_2


H_2.gif

CWCarouselStyle_H_3


H_3.gif
  • 控件實例對象創(chuàng)建
  1. 創(chuàng)建flowLayout對象,設(shè)置輪播圖風(fēng)格
/**
構(gòu)造方法

@param style 輪播圖風(fēng)格
@return 實例對象
*/
- (instancetype)initWithStyle:(CWCarouselStyle)style;

// egg:
CWFlowLayout *flowLayout = [[CWFlowLayout alloc] initWithStyle:[self styleFromTag:tag]];
  1. 創(chuàng)建容器對象
/**
創(chuàng)建實例構(gòu)造方法

@param frame 尺寸大小
@param delegate 代理
@param datasource 數(shù)據(jù)源
@param flowLayout 自定義flowlayout
@return 實例對象
*/
- (instancetype _Nullable )initWithFrame:(CGRect)frame
                                delegate:(id<CWCarouselDelegate> _Nullable)delegate
                              datasource:(id<CWCarouselDatasource> _Nullable)datasource
                              flowLayout:(nonnull CWFlowLayout *)flowLayout;

// egg:
CWCarousel *carousel = [[CWCarousel alloc] initWithFrame:self.animationView.bounds
                                                delegate:self
                                              datasource:self
                                              flowLayout:flowLayout];
  1. 注冊自定義cell,并實現(xiàn)代理方法,刷新視圖
[carousel registerViewClass:[UICollectionViewCell class] identifier:@"cellId"];
[carousel freshCarousel];

#pragma mark - Delegate
// 每個輪播圖cell樣式
- (UICollectionViewCell *)viewForCarousel:(CWCarousel *)carousel indexPath:(NSIndexPath *)indexPath index:(NSInteger)index{
    UICollectionViewCell *cell = [carousel.carouselView dequeueReusableCellWithReuseIdentifier:@"cellId" forIndexPath:indexPath];
    /*
    your code
    */
    return cell;
}

// 點擊代理回調(diào)
- (void)CWCarousel:(CWCarousel *)carousel didSelectedAtIndex:(NSInteger)index {
    NSLog(@"...%ld...", index);
}

// 輪播圖個數(shù)
- (NSInteger)numbersForCarousel {
    return kCount;
}
  1. 為了流暢性和避免概率圖片位置錯亂問題,當(dāng)開啟自動滾動時,在banner所處的控制器生命周期中需要調(diào)用以下對應(yīng)方法
/**
輪播圖所處控制器WillAppear方法里調(diào)用
*/
- (void)controllerWillAppear;

/**
輪播圖所處控制器WillDisAppear方法里調(diào)用
*/
- (void)controllerWillDisAppear;
  • 具體UI樣式修改都有具體的屬性,詳情請查看對應(yīng)類的.h文件即可.
  • 如有問題和bug,歡迎指正.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市志珍,隨后出現(xiàn)的幾起案子橙垢,更是在濱河造成了極大的恐慌,老刑警劉巖伦糯,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钢悲,死亡現(xiàn)場離奇詭異,居然都是意外死亡舔株,警方通過查閱死者的電腦和手機莺琳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來载慈,“玉大人惭等,你說我怎么就攤上這事“煺。” “怎么了辞做?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寡具。 經(jīng)常有香客問我秤茅,道長,這世上最難降的妖魔是什么童叠? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任框喳,我火速辦了婚禮课幕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘五垮。我一直安慰自己乍惊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布放仗。 她就那樣靜靜地躺著润绎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诞挨。 梳的紋絲不亂的頭發(fā)上莉撇,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音惶傻,去河邊找鬼稼钩。 笑死,一個胖子當(dāng)著我的面吹牛达罗,可吹牛的內(nèi)容都是我干的坝撑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼粮揉,長吁一口氣:“原來是場噩夢啊……” “哼巡李!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起扶认,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤侨拦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辐宾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狱从,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年叠纹,在試婚紗的時候發(fā)現(xiàn)自己被綠了季研。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡誉察,死狀恐怖与涡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情持偏,我是刑警寧澤驼卖,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站鸿秆,受9級特大地震影響酌畜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卿叽,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一桥胞、第九天 我趴在偏房一處隱蔽的房頂上張望恳守。 院中可真熱鬧,春花似錦埠戳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至喳钟,卻和暖如春屁使,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奔则。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工蛮寂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人易茬。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓酬蹋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親抽莱。 傳聞我的和親對象是個殘疾皇子范抓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容