iOS開發(fā)之 - 刷新框架 MJRefresh 的使用

MJRefresh

下拉刷新控件目前比較火的有好幾種友瘤,此前用過MJRefresh SVPullToRefresh,相對而言仰禀,還是覺得 MJRefresh 更好用浑劳!因此抽了些時(shí)間整理了 MJRefresh 的用法。以下是文章內(nèi)容琐馆。规阀。。

【文章目錄】

一瘦麸、類結(jié)構(gòu)圖

  • MJRefreshComponent.h
  • MJRefreshHeader.h
  • MJRefreshFooter.h
  • MJRefreshAutoFooter.h

二谁撼、參考例子

  • 下拉刷新01-默認(rèn)
  • 下拉刷新02-動畫圖片
  • 下拉刷新03-隱藏時(shí)間
  • 下拉刷新04-隱藏狀態(tài)和時(shí)間
  • 下拉刷新05-自定義文字
  • 下拉刷新06-自定義刷新控件
  • 上拉刷新01-默認(rèn)
  • 上拉刷新02-動畫圖片
  • 上拉刷新03-隱藏刷新狀態(tài)的文字
  • 上拉刷新04-全部加載完畢
  • 上拉刷新05-自定義文字
  • 上拉刷新06-加載后隱藏
  • 上拉刷新07-自動回彈的上拉01
  • 上拉刷新08-自動回彈的上拉02
  • 上拉刷新09-自定義刷新控件(自動刷新)
  • 上拉刷新10-自定義刷新控件(自動回彈)
  • UICollectionView01-上下拉刷新
  • UIWebView01-下拉刷新

【文章內(nèi)容】

1.類結(jié)構(gòu)圖

類結(jié)構(gòu)圖

MJRefreshComponent.h

/** 刷新控件的基類 */
@interface MJRefreshComponent : UIView
#pragma mark - 刷新狀態(tài)控制
/** 進(jìn)入刷新狀態(tài) */
- (void)beginRefreshing;
/** 結(jié)束刷新狀態(tài) */
- (void)endRefreshing;
/** 是否正在刷新 */
- (BOOL)isRefreshing;

#pragma mark - 其它
/** 根據(jù)拖拽比例自動切換透明度 */
@property (assign, nonatomic, getter=isAutomaticallyChangeAlpha) BOOL automaticallyChangeAlpha;
@end

MJRefreshHeader.h

@interface MJRefreshHeader : MJRefreshComponent
/** 創(chuàng)建 header */
+ (instancetype)headerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock;
/** 創(chuàng)建 header */
+ (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)action;

/** 這個(gè) key 用來存儲上一次下拉刷新成功的時(shí)間 */
@property (copy, nonatomic) NSString *lastUpdatedTimeKey;
/** 上一次下拉刷新成功的時(shí)間 */
@property (strong, nonatomic, readonly) NSDate *lastUpdatedTime;

/** 忽略多少 scrollView 的 contentInset 的頂部 */
@property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetTop;
@end

MJRefreshFooter.h

@interface MJRefreshFooter : MJRefreshComponent
/** 創(chuàng)建 footer */
+ (instancetype)footerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock;
/** 創(chuàng)建 footer */
+ (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action;

/** 提示沒有更多的數(shù)據(jù) */
- (void)noticeNoMoreData;
/** 重置沒有更多的數(shù)據(jù)(消除沒有更多數(shù)據(jù)的狀態(tài)) */
- (void)resetNoMoreData;

/** 忽略多少 scrollView 的 contentInset 的底部*/
@property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetBottom;

/** 自動根據(jù)有無數(shù)據(jù)來顯示和隱藏 */
@property (assign, nonatomic) BOOL automaticallyHidden;
@end

MJRefreshAutoFooter.h

@interface MJRefreshAutoFooter : MJRefreshFooter
/** 是否自動刷新(默認(rèn)為 YES) */
@property (assign, nonatomic, getter=isAutomaticallyRefresh) BOOL automaticallyRefresh;

/** 當(dāng)?shù)撞靠丶霈F(xiàn)多少時(shí)就自動刷新(默認(rèn)為1.0,也就是底部控件完全出現(xiàn)時(shí)瞎暑,才會自動刷新) */
@property (assign, nonatomic) CGFloat appearencePercentTriggerAutoRefresh;
@end

2.參考例子

ps: 可以下載 MJRefresh試試

MJRefresh 演示

下拉刷新01-默認(rèn)

    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
        // 進(jìn)入刷新狀態(tài)后會自動調(diào)用這個(gè)block
    }];
    // 或
    // 設(shè)置回調(diào)(一旦進(jìn)入刷新狀態(tài)彤敛,就調(diào)用 target 的 action,也就是調(diào)用 self 的 loadNewData 方法)
    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
    // 馬上進(jìn)入刷新狀態(tài)
    [self.tableView.mj_header beginRefreshing];
下拉刷新01-默認(rèn)

下拉刷新02-動畫圖片

    // 設(shè)置回調(diào)(一旦進(jìn)入刷新狀態(tài)了赌,就調(diào)用 targett 的 action墨榄,即調(diào)用 self 的 loadNewData 方法)
    MJRefreshGifHeader *header = [MJRefreshGifHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
    
    // 設(shè)置普通狀態(tài)的動畫圖片
    NSArray *idleImages = @[@"圖片1", @"圖片2", @"圖片3"];
    [header setImages:idleImages forState:MJRefreshStateIdle];
    
    // 設(shè)置即將刷新狀態(tài)的動畫圖片(一松開就會刷新的狀態(tài))
    NSArray *pullingImages = @[@"圖片1", @"圖片2", @"圖片3"];
    [header setImages:pullingImages forState:MJRefreshStatePulling];
    
    // 設(shè)置正在刷新狀態(tài)的動畫圖片
    NSArray *refreshingImages = @[@"圖片1", @"圖片2", @"圖片3"];
    [header setImages:refreshingImages forState:MJRefreshStateRefreshing];
    // 設(shè)置 header
    self.tableView.mj_header = header;
下拉刷新02-動畫圖片

下拉刷新03-隱藏時(shí)間

// 隱藏時(shí)間
header.lastUpdatedTimeLabel.hidden = YES;
下拉刷新03-隱藏時(shí)間

下拉刷新04-隱藏狀態(tài)和時(shí)間

// 隱藏時(shí)間
header.lastUpdatedTimeLabel.hidden = YES;

// 隱藏狀態(tài)
header.stateLabel.hidden = YES;
下拉刷新04-隱藏狀態(tài)和時(shí)間

下拉刷新05-自定義文字

// 設(shè)置文字
[header setTitle:@"Pull down to refresh" forState:MJRefreshStateIdle];
[header setTitle:@"Release to refresh" forState:MJRefreshStatePulling];
[header setTitle:@"Loading ..." forState:MJRefreshStateRefreshing];

// 設(shè)置字體
header.stateLabel.font = [UIFont systemFontOfSize:15];
header.lastUpdatedTimeLabel.font = [UIFont systemFontOfSize:14];

// 設(shè)置顏色
header.stateLabel.textColor = [UIColor redColor];
header.lastUpdatedTimeLabel.textColor = [UIColor blueColor];
下拉刷新05-自定義文字

下拉刷新06-自定義刷新控件

self.tableView.mj_header = [MJDIYHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
// 具體實(shí)現(xiàn)參考 MJDIYHeader.h 和 MJDIYHeader.m
下拉刷新06-自定義刷新控件

上拉刷新01-默認(rèn)

    self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
        // 進(jìn)入刷新狀態(tài)后會自動調(diào)用這個(gè) block
    }];
    // 或
    // 設(shè)置回調(diào)(一旦進(jìn)入刷新狀態(tài),就調(diào)用 target 的 action勿她,即調(diào)用 self 的 loadMoreData 方法)
    self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
上拉刷新01-默認(rèn)

上拉刷新02-動畫圖片


    // 設(shè)置回調(diào)(一旦進(jìn)入刷新狀態(tài)袄秩,就調(diào)用 target 的 action,即調(diào)用 self 的 loadMoreData 方法)
    MJRefreshAutoGifFooter *footer = [MJRefreshAutoGifFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
    
    // 設(shè)置刷新圖片
    NSArray *refreshingImages = @[@"圖片1", @"圖片2", @"圖片3"];
    [footer setImages:refreshingImages forState:MJRefreshStateRefreshing];
    
    // 設(shè)置尾部
    self.tableView.mj_footer = footer;
上拉刷新02-動畫圖片

上拉刷新03-隱藏刷新狀態(tài)的文字

// 隱藏刷新狀態(tài)的文字
footer.refreshingTitleHidden = YES;
// 如果沒有上面的方法逢并,就用footer.stateLabel.hidden = YES;
上拉刷新03-隱藏刷新狀態(tài)的文字

上拉刷新04-全部加載完畢

    // 變?yōu)闆]有更多數(shù)據(jù)的狀態(tài)
    [footer endRefreshingWithNoMoreData];
上拉刷新04-全部加載完畢

上拉刷新05-自定義文字

// 設(shè)置文字
[footer setTitle:@"Click or drag up to refresh" forState:MJRefreshStateIdle];
[footer setTitle:@"Loading more ..." forState:MJRefreshStateRefreshing];
[footer setTitle:@"No more data" forState:MJRefreshStateNoMoreData];

// 設(shè)置字體
footer.stateLabel.font = [UIFont systemFontOfSize:17];

// 設(shè)置顏色
footer.stateLabel.textColor = [UIColor blueColor];
上拉刷新05-自定義文字

上拉刷新06-加載后隱藏

// 隱藏當(dāng)前的上拉刷新控件
self.tableView.mj_footer.hidden = YES;
上拉刷新06-加載后隱藏

上拉刷新07-自動回彈的上拉01

self.tableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
上拉刷新07-自動回彈的上拉01

上拉刷新08-自動回彈的上拉02


    MJRefreshBackGifFooter *footer = [MJRefreshBackGifFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
    
    // 設(shè)置普通狀態(tài)的動畫圖片
    NSArray *idleImages = @[@"圖片1", @"圖片2", @"圖片3"];
    [footer setImages:idleImages forState:MJRefreshStateIdle];
    
    // 設(shè)置即將刷新狀態(tài)的動畫圖片(一松開就會刷新的狀態(tài))
    NSArray *pullingImages = @[@"圖片1", @"圖片2", @"圖片3"];

    [footer setImages:pullingImages forState:MJRefreshStatePulling];
    
    // 設(shè)置正在刷新狀態(tài)的動畫圖片
    NSArray *refreshingImages = @[@"圖片1", @"圖片2", @"圖片3"];
    [footer setImages:refreshingImages forState:MJRefreshStateRefreshing];
    
    // 設(shè)置尾部
    self.tableView.mj_footer = footer;
上拉刷新08-自動回彈的上拉02

上拉刷新09-自定義刷新控件(自動刷新)

self.tableView.mj_footer = [MJDIYAutoFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
// 具體實(shí)現(xiàn)參考MJDIYAutoFooter.h和MJDIYAutoFooter.m
上拉刷新09-自定義刷新控件(自動刷新)

上拉刷新10-自定義刷新控件(自動回彈)

self.tableView.mj_footer = [MJDIYBackFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
// 具體實(shí)現(xiàn)參考MJDIYBackFooter.h和MJDIYBackFooter.m
上拉刷新10-自定義刷新控件(自動回彈)

UICollectionView01-上下拉刷新

// 下拉刷新
self.collectionView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
  // 進(jìn)入刷新狀態(tài)后會自動調(diào)用這個(gè)block
}];
// 上拉刷新
self.collectionView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
  // 進(jìn)入刷新狀態(tài)后會自動調(diào)用這個(gè)block
}];
UICollectionView01-上下拉刷新

UIWebView01-下拉刷新

// 添加下拉刷新控件
self.webView.scrollView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
   // 進(jìn)入刷新狀態(tài)后會自動調(diào)用這個(gè)block
}];
UIWebView01-下拉刷新
  • over
    以上是 MJRefresh 的具體用法之剧,有興趣的朋友還可以參考下MJRefresh/README.md
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市砍聊,隨后出現(xiàn)的幾起案子背稼,更是在濱河造成了極大的恐慌,老刑警劉巖玻蝌,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蟹肘,死亡現(xiàn)場離奇詭異,居然都是意外死亡俯树,警方通過查閱死者的電腦和手機(jī)帘腹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來许饿,“玉大人阳欲,你說我怎么就攤上這事。” “怎么了球化?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵秽晚,是天一觀的道長。 經(jīng)常有香客問我赊窥,道長爆惧,這世上最難降的妖魔是什么狸页? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任锨能,我火速辦了婚禮,結(jié)果婚禮上芍耘,老公的妹妹穿的比我還像新娘址遇。我一直安慰自己,他們只是感情好斋竞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布倔约。 她就那樣靜靜地躺著,像睡著了一般坝初。 火紅的嫁衣襯著肌膚如雪浸剩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天鳄袍,我揣著相機(jī)與錄音绢要,去河邊找鬼。 笑死拗小,一個(gè)胖子當(dāng)著我的面吹牛重罪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哀九,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼剿配,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了阅束?” 一聲冷哼從身側(cè)響起呼胚,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎息裸,沒想到半個(gè)月后蝇更,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡界牡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年簿寂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宿亡。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡常遂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挽荠,到底是詐尸還是另有隱情克胳,我是刑警寧澤平绩,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站漠另,受9級特大地震影響捏雌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笆搓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一性湿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧满败,春花似錦肤频、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至净嘀,卻和暖如春报咳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挖藏。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工暑刃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人熬苍。 一個(gè)月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓稍走,卻偏偏與公主長得像,于是被迫代替她去往敵國和親柴底。 傳聞我的和親對象是個(gè)殘疾皇子婿脸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

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