仿UITableView制作廣告輪播器

最近在做一個項(xiàng)目需要用到一個滾動評論,當(dāng)然前面的項(xiàng)目中也有許多地方用到了這一控件,雖然網(wǎng)絡(luò)上關(guān)于這種控件的封裝思想大致也就那么幾種,具體哪幾種大家可以去搜索一下,但是對于這種控件的使用,每次使用總是需要重新更改里面的代碼,雖說不是一個大的控件,但是,更改起來卻也是很煩人,所以自己就依據(jù)系統(tǒng)的UITableView的使用方法封裝了該控件.廢話不多說,程序員看的是實(shí)現(xiàn)效果以及代碼思想,希望能幫助到需要的朋友.

效果圖如下###

2.gif

使用方法如下###

  • 首先引入頭文件
    <pre><code>#import "GGCMTView.h"</code></pre>

  • 創(chuàng)建對象
    1.創(chuàng)建對象的時候類型有兩種一種是:CMTViewHorizontalStyle
    另一種是:CMTViewVerticalStyle
    其中CMTViewHorizontalStyle創(chuàng)建的是水平滾動類型的,就是平痴觯縮減的廣告輪播圖
    而CMTViewVerticalStyle 創(chuàng)建的則是垂直滾動類型,常見的滾動評論
    //創(chuàng)建方法如下
    GGCMTView * cmtView = [[GGCMTView alloc]initWithFrame:CGRectMake(0, 100, self.view.width, 200) andCMTViewStyle:CMTViewHorizontalStyle];
    //GGCMTView * cmtView = [[GGCMTView alloc]initWithFrame:CGRectMake(0, 100, self.view.width, 200) andCMTViewStyle: CMTViewVerticalStyle];

  • 設(shè)置對象的屬性,數(shù)據(jù)源,代理,其中屬性包括設(shè)置滾動間隔,是否允許用戶拖動
    //用來設(shè)置每一次滾動的間隔時間,默認(rèn)為0.5秒
    cmtView.timeInterval = 4.0f;
    //用來設(shè)置是否允許用戶拖動,默認(rèn)為NO
    cmtView.enableUserScroll = YES;
    //將該view加到控制器中
    [self.view addSubview:cmtView];
    //為cmtView設(shè)置數(shù)據(jù)源
    cmtView.dataSource = self;
    //為cmtView設(shè)置代理
    cmtView.delegate = self;

  • GGCMTView的數(shù)據(jù)源cmtViewDataSource是一個協(xié)議包含兩個接口方法,都是必須實(shí)現(xiàn)的,一個是用來返回滾動的內(nèi)容總共有多少條,另一個是用來返回滾動的自定義視圖,利用系統(tǒng)的UITableViewCell來接收,該創(chuàng)建方法與系統(tǒng)UITableViewCell的創(chuàng)建方法保持一致.

具體代碼如下:

@protocol cmtViewDataSource <NSObject>
@required
//返回有多少條
- (NSInteger)numberOfPageInCmtView:(GGCMTView *)cmtView;
//返回每一個滾動的自定義視圖,直接返回自定義的UITableViewCell
- (__kindof UITableViewCell *)cmtView:(GGCMTView *)cmtView cellForIndex:(NSInteger)index;
@end
  • GGCMTView的代理方法cmtViewDelegate只定義了一個可選實(shí)現(xiàn)的接口,該接口用來告訴代理點(diǎn)擊了某一個Cell,返回點(diǎn)擊cell的index

具體代碼如下:

@protocol cmtViewDelegate <NSObject>
@optional
//用來告訴點(diǎn)擊了某個index的cell
- (void)cmtView:(GGCMTView *)cmtView didSelectIndex:(NSInteger)index;
@end
  • GGCMTView暴露出來的對象方法有八個,有五個是關(guān)于生命周期的方法,具體每個方法的作用見下面的代碼注釋

用來創(chuàng)建cmtView CMTViewStyle在創(chuàng)建的時候給定,在此類的屬性中包含字段cmtViewStyle 但其僅是可讀的,僅用來讀取其類型
- (instancetype)initWithFrame:(CGRect)frame andCMTViewStyle:(CMTViewStyle)cmtViewStyle;
此方法用來從緩沖池中取得cell,如果沒有,則需要手動創(chuàng)建cell,用法與系統(tǒng)的UITableView保持一致
- (__kindof UITableViewCell *)dequeueReusableCMTViewCellWithIdentifier:(NSString *)identifier;
如果UITableViewCell 有使用xib,則可以使用此方法來進(jìn)行注冊nib,用法與UITableView 保持一致
- (void)registerNib:(UINib *)nib forCMTViewCellReuseIdentifier:(NSString *)identifier;

此方法用來準(zhǔn)備開始動畫
- (void)prepareScroll;
此方法用來開始動畫
- (void)startScroll;
此方法用來停止動畫
- (void)stopScroll;
此方法用來暫停動畫
- (void)pauseScroll;
此方法用來繼續(xù)動畫
- (void)continueScroll;

由于該類使用的定時器是NSTimer ,所以要求使用者,在controller中視圖將要消失的時候調(diào)用暫颓担或者停止方法,而在視圖將要出現(xiàn)的時候根據(jù)需要,用來開始,或者繼續(xù)動畫,首次開始滾動之前需要調(diào)用prepareScroll方法,初始化一下數(shù)據(jù),若是想使數(shù)據(jù)重新從第0頁開始,也可以手動調(diào)用此方法

具體的使用Demo見下方源碼


#import "ViewController.h"
#import "GGCMTView.h"
#import "CustomTableViewCell.h"
#import "UIView+Frame.h"

static NSString * reuseIdentifier = @"cell";
@interface ViewController ()<cmtViewDelegate,cmtViewDataSource>

@property(nonatomic,strong)NSArray * dataArr1;
@property(nonatomic,strong)NSArray * dataArr2;
@property(nonatomic,strong)GGCMTView * cmtView1;
@property(nonatomic,strong)GGCMTView * cmtView2;

@end

@implementation ViewController

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.cmtView1 pauseScroll];
    [self.cmtView2 pauseScroll];
    
}

- (NSArray *)dataArr1{
    if (!_dataArr1) {
        _dataArr1 = @[@"1.jpg",@"2.jpg",@"3.jpg",@"4.jpg",@"5.jpg",@"6.jpg",@"7.jpg"];
    }
    return _dataArr1;
}
- (NSArray *)dataArr2{
    if (!_dataArr2) {
        _dataArr2 = @[@"7.jpg",@"6.jpg",@"5.jpg",@"4.jpg",@"3.jpg",@"2.jpg",@"1.jpg"];
    }
    return _dataArr2;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor grayColor];
    [self testCMTView];
    [self testCMTView2];
    
}


- (void)testCMTView{
    GGCMTView * cmtView = [[GGCMTView alloc]initWithFrame:CGRectMake(0, 100, self.view.width, 200) andCMTViewStyle:CMTViewHorizontalStyle];
    cmtView.timeInterval = 4.0f;
    cmtView.enableUserScroll = YES;
    [self.view addSubview:cmtView];
    cmtView.dataSource = self;
    cmtView.delegate = self;
    self.cmtView1 = cmtView;
    
    [cmtView prepareScroll];
    [cmtView startScroll];
}

- (void)testCMTView2{
    GGCMTView * cmtView = [[GGCMTView alloc]initWithFrame:CGRectMake(0, 330, self.view.width, 200) andCMTViewStyle:CMTViewVerticalStyle];
    cmtView.timeInterval = 4.0f;
    cmtView.enableUserScroll = YES;
    [self.view addSubview:cmtView];
    cmtView.dataSource = self;
    cmtView.delegate = self;
    self.cmtView2 = cmtView;
    [cmtView prepareScroll];
    [cmtView startScroll];
}

- (UITableViewCell *)cmtView:(GGCMTView *)cmtView cellForIndex:(NSInteger)index{
    
    CustomTableViewCell * cell = [CustomTableViewCell customTableViewCellWithTableView:cmtView];
    if (cmtView == self.cmtView1) {
        cell.image.image = [UIImage imageNamed:self.dataArr1[index]];
        cell.cust.text = self.dataArr1[index];
    }else{
        cell.image.image = [UIImage imageNamed:self.dataArr2[index]];
        cell.cust.text = self.dataArr2[index];
    }
    return cell;
}

- (void)cmtView:(GGCMTView *)cmtView didSelectIndex:(NSInteger)index{
    if (cmtView == self.cmtView1) {
        NSLog(@"第%ld張   =====   名字是 %@",(long)index,self.dataArr1[index]);
    }else{
        NSLog(@"第%ld張   =====   名字是 %@",(long)index,self.dataArr2[index]);
    }
    
}

- (NSInteger)numberOfPageInCmtView:(GGCMTView *)cmtView{
    
    if (cmtView == self.cmtView1) {
        return self.dataArr1.count;
    }
    return self.dataArr2.count;
}


@end


總結(jié):作為一個程序員,如果想提升自己,我個人覺得思想最為重要,一個好的解決方案,快速的建模反應(yīng),快速的接收速度以及學(xué)習(xí)能力,是一個好的程序員的必備素質(zhì),在我們自己嘗試著學(xué)習(xí)思想之前,那就先模仿系統(tǒng)的吧,學(xué)習(xí)成本低而且思想也比較成熟了,對吧,希望大家一起努力,另外在源碼中,對tableViewCell的復(fù)用我這兒處理的不是很好,希望有高人可以指點(diǎn)一二,大家共同進(jìn)步,謝謝!

Github 源碼請點(diǎn)擊這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舅世,一起剝皮案震驚了整個濱河市杆麸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌羞福,老刑警劉巖伺通,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肉拓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)梳庆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門暖途,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人膏执,你說我怎么就攤上這事驻售。” “怎么了更米?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵欺栗,是天一觀的道長。 經(jīng)常有香客問我征峦,道長迟几,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任栏笆,我火速辦了婚禮类腮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛉加。我一直安慰自己蚜枢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布针饥。 她就那樣靜靜地躺著厂抽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丁眼。 梳的紋絲不亂的頭發(fā)上筷凤,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機(jī)與錄音户盯,去河邊找鬼嵌施。 笑死,一個胖子當(dāng)著我的面吹牛莽鸭,可吹牛的內(nèi)容都是我干的吗伤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼硫眨,長吁一口氣:“原來是場噩夢啊……” “哼足淆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤巧号,失蹤者是張志新(化名)和其女友劉穎族奢,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丹鸿,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡越走,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了靠欢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片廊敌。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖门怪,靈堂內(nèi)的尸體忽然破棺而出骡澈,到底是詐尸還是另有隱情,我是刑警寧澤掷空,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布肋殴,位于F島的核電站,受9級特大地震影響坦弟,放射性物質(zhì)發(fā)生泄漏护锤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一减拭、第九天 我趴在偏房一處隱蔽的房頂上張望蔽豺。 院中可真熱鬧区丑,春花似錦拧粪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宴杀,卻和暖如春癣朗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旺罢。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工旷余, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扁达。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓正卧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親跪解。 傳聞我的和親對象是個殘疾皇子炉旷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

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