亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS實現MJRefresh下拉刷新(上拉加載)使用詳解

2020-07-26 02:57:48
字體:
來源:轉載
供稿:網友

下拉刷新控件目前比較火的有好幾種,本人用過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.VeVB.COm/201701/yuanma/MJRefresh_jb51.rar

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产va免费精品高清在线| 国产一区二区三区丝袜| 亚洲大尺度美女在线| 91免费看国产| 日韩国产高清视频在线| 日韩资源在线观看| 日本成人免费在线| 久久久久久久久久久人体| 在线看福利67194| 亚洲国产精久久久久久| 91精品国产99| 久久伊人91精品综合网站| 国产欧美日韩免费| 成人久久18免费网站图片| 亚洲在线视频福利| 日韩精品福利在线| 欧美猛少妇色xxxxx| 亚洲va久久久噜噜噜久久天堂| 欧美中文字幕在线视频| 亚洲韩国欧洲国产日产av| 国产成人av网址| 日韩精品久久久久久福利| 亚洲一区二区三区毛片| 国产婷婷色综合av蜜臀av| 国产精品成人观看视频国产奇米| 欧美丰满少妇xxxxx| 伊人久久男人天堂| 91久久国产婷婷一区二区| 久久久久久久国产精品| 国产精品视频一区国模私拍| 久久久成人精品视频| 一个人看的www久久| 欧美床上激情在线观看| 欧美在线视频一二三| 国产精品自在线| 亚洲色图色老头| 久久伊人精品一区二区三区| 精品激情国产视频| 久久久久久久久久久免费精品| 91系列在线播放| 成人国产亚洲精品a区天堂华泰| 国产精品入口日韩视频大尺度| 亚洲美女免费精品视频在线观看| 亚洲视频在线观看视频| 国产伦精品免费视频| 最近2019年手机中文字幕| 中文字幕精品一区久久久久| 亚洲一区中文字幕在线观看| 亚洲综合最新在线| 5566日本婷婷色中文字幕97| 国产精品日韩在线观看| 成人精品视频在线| 国产成人精品在线视频| 国产欧亚日韩视频| 亚洲成人性视频| 精品欧美aⅴ在线网站| 国产成人福利网站| 夜夜狂射影院欧美极品| 欧美激情综合色综合啪啪五月| 亚洲一区二区久久久久久| 欧美午夜视频在线观看| xxxxx91麻豆| 精品国产31久久久久久| 久久精品国产视频| 国产精品久久久久久久久久久新郎| 国产精品美女呻吟| 国产精品免费小视频| 97视频在线观看成人| 91av在线影院| 91久久在线观看| 国产精品嫩草影院一区二区| 91色琪琪电影亚洲精品久久| 最近的2019中文字幕免费一页| 97在线视频免费看| 2019av中文字幕| 日韩少妇与小伙激情| 精品亚洲一区二区三区在线播放| 一区二区欧美久久| 亚洲最新视频在线| 亚洲аv电影天堂网| 久久99国产综合精品女同| 欧美日本高清一区| 久久天天躁夜夜躁狠狠躁2022| 中文字幕国产精品| 亚洲在线观看视频网站| 亚洲第一av在线| 69av成年福利视频| 日韩欧美在线网址| 亚洲国产精品嫩草影院久久| 国内精品美女av在线播放| 国产精品91在线观看| 精品成人69xx.xyz| 亲子乱一区二区三区电影| 8050国产精品久久久久久| 久久青草精品视频免费观看| 欧美成人午夜影院| 国产精品影院在线观看| 国产精品1区2区在线观看| 国内精品美女av在线播放| 成人伊人精品色xxxx视频| 亚洲国产精品系列| 欧美性生交xxxxxdddd| 日韩在线播放视频| 久久国产视频网站| 日韩美女免费线视频| 91精品国产777在线观看| 久久久国产一区| 亚洲一区二区三区xxx视频| 欧美视频国产精品| 国产脚交av在线一区二区| 亚洲专区在线视频| 欧美午夜激情小视频| 久久久久久久久91| 欧美日韩国产一区在线| 亚洲国产高潮在线观看| 日韩av一区二区在线观看| 亚洲在线视频福利| 中国china体内裑精亚洲片| 美女999久久久精品视频| 中文字幕亚洲一区二区三区| 欧美裸体男粗大视频在线观看| 国产精品第二页| 亚洲视频欧洲视频| 久久久久久69| 日韩中文字幕在线视频播放| 66m—66摸成人免费视频| 国产日韩欧美在线| 在线电影av不卡网址| 国产精品久久综合av爱欲tv| 亚洲国产精品va| 欧美大片免费观看在线观看网站推荐| 秋霞午夜一区二区| 日韩中文字幕免费看| 欧美成人精品激情在线观看| 亚洲伦理中文字幕| 欧美亚洲视频在线看网址| 国产亚洲精品久久久久久777| 久久亚洲精品国产亚洲老地址| 日韩欧美一区二区三区| 51视频国产精品一区二区| 日本精品视频在线| 日韩中文字幕国产精品| 国精产品一区一区三区有限在线| 亚洲视频在线观看| 麻豆成人在线看| 精品二区三区线观看| 成人在线视频网| 国色天香2019中文字幕在线观看| 欧美专区在线观看| 91av在线视频观看| 亚洲精品电影在线观看| 午夜精品一区二区三区在线视频| 亚洲成年人影院在线| 精品视频—区二区三区免费| 国产偷亚洲偷欧美偷精品| 最近免费中文字幕视频2019| 亚洲精品国偷自产在线99热| 久久精品视频一| 91成人在线播放| 欧美色另类天堂2015| 欧美另类第一页| 韩曰欧美视频免费观看| 成人a级免费视频| 亚洲美女性生活视频|