下拉刷新控件目前比擬火的有好幾種,自己用過MJRefresh 和 SVPullToRefresh,絕對而言,前者比後者可定制化、拓展新都更高一點。
因而本文著重講一下MJRefresh的復雜用法。
導入項目:
cocoapods導入:pod 'MJRefresh'
手動導入:
將MJRefresh文件夾中的一切文件拽入項目中 導入主頭文件:#import "MJRefresh.h"運用引見:
普遍性分為6種運用場景,辨別對應:默許、動畫圖片、隱藏時間、隱藏時間和形態、自定義文字闡明、以及自定義刷新控件。
上面就各種場景辨別講一下:
1、默許場景
包括刷新菊花、下拉闡明、時間
運用代碼:
#pragma mark UITableView + 下拉刷新 默許 - (void)example01 { __weak __typeof(self) weakSelf = self; // 設置回調(一旦進入刷新形態就會調用這個refreshingBlock) self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ [weakSelf loadNewData]; }]; // 馬上進入刷新形態 [self.tableView.mj_header beginRefreshing]; }
2、運用動畫圖片
PS:這裡的動畫並不是用gif完成的,而是應用序列幀(即若干圖片組成一個不同形態下的圖片數組,然後依據地位顯示不同圖片)去展示。
#pragma mark UITableView + 下拉刷新 動畫圖片 - (void)example02 { // 設置回調(一旦進入刷新形態,就調用target的action,也就是調用self的loadNewData辦法) self.tableView.mj_header = [MJChiBaoZiHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)]; // 馬上進入刷新形態 [self.tableView.mj_header beginRefreshing]; }
這裡用群眾點評吃包子圖片為例,新建一個自定義類 MJChiBaoZiHeader,承繼:MJRefreshGifHeader
#import "MJRefreshGifHeader.h" @interface MJChiBaoZiHeader : MJRefreshGifHeader @end
然後重寫prepare辦法,代碼:
- (void)prepare { [super prepare]; // 設置普通形態的動畫圖片 NSMutableArray *idleImages = [NSMutableArray array]; for (NSUInteger i = 1; i<=60; i++) { UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"dropdown_anim__000%zd", i]]; [idleImages addObject:image]; } [self setImages:idleImages forState:MJRefreshStateIdle]; // 設置行將刷新形態的動畫圖片(一松開就會刷新的形態) NSMutableArray *refreshingImages = [NSMutableArray array]; for (NSUInteger i = 1; i<=3; i++) { UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"dropdown_loading_0%zd", i]]; [refreshingImages addObject:image]; } [self setImages:refreshingImages forState:MJRefreshStatePulling]; // 設置正在刷新形態的動畫圖片 [self setImages:refreshingImages forState:MJRefreshStateRefreshing]; }
關鍵點就是這裡的兩個圖片數組,60是由於下拉控件默許拉動間隔就是60間隔,這裡比擬嚴謹,應用60張不同圖片去對應每個間隔點,當然實踐中,我們可以縮減,不需求准確到每個間隔點對應一張圖片,這裡團體自己決議。
這裡需求先理解下,下拉的五種形態。如下:
/** 刷新控件的形態 */ typedef NS_ENUM(NSInteger, MJRefreshState) { /** 普通閒置形態 */ MJRefreshStateIdle = 1, /** 松開就可以停止刷新的形態 */ MJRefreshStatePulling, /** 正在刷新中的形態 */ MJRefreshStateRefreshing, /** 行將刷新的形態 */ MJRefreshStateWillRefresh, /** 一切數據加載終了,沒有更多的數據了 */ MJRefreshStateNoMoreData };
idleImages圖片數組對應閒置下拉形態,表示下拉到臨界值前的展現圖片。
refreshingImages圖片數組對應正在刷新時的動畫展現圖片,普通這裡需求3~5張圖片去模仿動畫。<br><br>重寫完<span class="s1">prepare辦法,就可以完成動畫了。<br><br></span>
3、下拉刷新 隱藏時間
這裡與默許的區別就是不顯示上次刷新時間,運用辦法:
#pragma mark UITableView + 下拉刷新 隱藏時間 - (void)example03 { // 設置回調(一旦進入刷新形態,就調用target的action,也就是調用self的loadNewData辦法) MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)]; // 設置自動切換通明度(在導航欄上面自動隱藏) header.automaticallyChangeAlpha = YES; // 隱藏時間 header.lastUpdatedTimeLabel.hidden = YES; // 馬上進入刷新形態 [header beginRefreshing]; // 設置header self.tableView.mj_header = header; }
4、下拉刷新 隱藏形態和時間
這個場景普通適用於只需求動畫展現,簡約清新,也是用的蠻多的。
異樣,處置很復雜。
#pragma mark UITableView + 下拉刷新 隱藏形態和時間 - (void)example04 { // 設置回調(一旦進入刷新形態,就調用target的action,也就是調用self的loadNewData辦法) MJChiBaoZiHeader *header = [MJChiBaoZiHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)]; // 隱藏時間 header.lastUpdatedTimeLabel.hidden = YES; // 隱藏形態 header.stateLabel.hidden = YES; // 馬上進入刷新形態 [header beginRefreshing]; // 設置header self.tableView.mj_header = header; }
5、下拉刷新 自定義文字
想自己DIY特性文字描繪,一樣很復雜。
不論是文字text、文字大小、還是顏色都一句話搞定。
#pragma mark UITableView + 下拉刷新 自定義文字 - (void)example05 { // 設置回調(一旦進入刷新形態,就調用target的action,也就是調用self的loadNewData辦法) MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)]; // 設置文字 [header setTitle:@"快扯我,快點" forState:MJRefreshStateIdle]; [header setTitle:@"數據要來啦" forState:MJRefreshStatePulling]; [header setTitle:@"服務器正在狂奔 ..." forState:MJRefreshStateRefreshing]; // 設置字體 header.stateLabel.font = [UIFont systemFontOfSize:15]; header.lastUpdatedTimeLabel.font = [UIFont systemFontOfSize:14]; // 設置顏色 header.stateLabel.textColor = [UIColor redColor]; header.lastUpdatedTimeLabel.textColor = [UIColor grayColor]; // 馬上進入刷新形態 [header beginRefreshing]; // 設置刷新控件 self.tableView.mj_header = header; }
6、下拉刷新 自定義刷新控件
下面的都不夠玩,怎樣辦,沒關系,還有最後一種更定制化的辦法:自己加控件款式。
這裡不限於任何控件,我們可以在頭部的這片區域,縱情添加Subviews,但記住一點,高度千萬不要吵過header高度(默許60)。
除了控件,甚至可以自己繪制動畫等等。
完成原理:異樣先自定義自己的類,承繼 MJRefreshHeader
重寫 prepare 辦法,再重寫 placeSubviews 辦法 設置地位。
代碼:
a、定義控件屬性
@interface MJDIYHeader() @property (weak, nonatomic) UILabel *label; @property (weak, nonatomic) UISwitch *s; @property (weak, nonatomic) UIImageView *logo; @property (weak, nonatomic) UIActivityIndicatorView *loading; @end
b、重寫prepare辦法
#pragma mark 在這裡做一些初始化配置(比方添加子控件) - (void)prepare { [super prepare]; // 設置控件的高度 self.mj_h = 50; // 添加label UILabel *label = [[UILabel alloc] init]; label.textColor = [UIColor colorWithRed:1.0 green:0.5 blue:0.0 alpha:1.0]; label.font = [UIFont boldSystemFontOfSize:16]; label.textAlignment = NSTextAlignmentCenter; [self addSubview:label]; self.label = label; // 打醬油的開關 UISwitch *s = [[UISwitch alloc] init]; [self addSubview:s]; self.s = s; // logo UIImageView *logo = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Logo"]]; logo.contentMode = UIViewContentModeScaleaspectFit; [self addSubview:logo]; self.logo = logo; // loading UIActivityIndicatorView *loading = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; [self addSubview:loading]; self.loading = loading; }
c、重寫 placeSubviews
#pragma mark 在這裡設置子控件的地位和尺寸 - (void)placeSubviews { [super placeSubviews]; self.label.frame = self.bounds; self.logo.bounds = CGRectMake(0, 0, self.bounds.size.width, 100); self.logo.center = CGPointMake(self.mj_w * 0.5, - self.logo.mj_h + 20); self.loading.center = CGPointMake(self.mj_w - 30, self.mj_h * 0.5); }
d、依據下拉位移,自定義不同位移的控件展現,比方顯示不同文字,顏色等
#pragma mark 監聽控件的刷新形態 - (void)setState:(MJRefreshState)state { MJRefreshCheckState; switch (state) { case MJRefreshStateIdle: [self.loading stopAnimating]; [self.s setOn:NO animated:YES]; self.label.text = @"趕忙下拉吖(開關是打醬油滴)"; break; case MJRefreshStatePulling: [self.loading stopAnimating]; [self.s setOn:YES animated:YES]; self.label.text = @"趕忙放開我吧(開關是打醬油滴)"; break; case MJRefreshStateRefreshing: [self.s setOn:YES animated:YES]; self.label.text = @"加載數據中(開關是打醬油滴)"; [self.loading startAnimating]; break; default: break; } }
上拉刷新加載其實和下拉是同理,只不過區別就是:
self.tableView.mj_header 變成 self.tableView.mj_footer,前面的類也由
MJRefreshNormalHeader 變成 MJRefreshAutoNormalFooter。
完成原理是相反的。
下載源碼:http://xiazai.jb51.net/201701/yuanma/MJRefresh_jb51.rar
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支持本站。
【iOS完成MJRefresh下拉刷新(上拉加載)運用詳解】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!