demo鏈接:
平頂山網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,平頂山網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為平頂山近1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的平頂山做網(wǎng)站的公司定做!
喜歡的話請在github給顆小星星哦????!
先說一下用法,然后再說實(shí)現(xiàn)
使用方法很簡單,導(dǎo)入頭文件UIView+XDRefresh.h
用一個與下拉刷新小圓圈一樣大小的scrollview,把其contentSize也置為同樣大小,然后把下拉刷新的小圓圈放到scrollview上,這樣在下拉刷新過程中只需要根據(jù)被觀察者的下拉狀態(tài)去改變這個scrollview的contentoffset.y即可實(shí)現(xiàn)小圓圈的上下移動,而不需要去渲染下拉小圓圈的frame
刷新過程主要分為三種狀態(tài)
主要方法,通過kvo去觀察tableview的下拉過程
實(shí)現(xiàn)觀察者的代理 并在其中實(shí)現(xiàn)三種狀態(tài)(非刷新,刷新,(全非)既不刷新也不非刷新)
全非狀態(tài)時直接return 以屏蔽掉刷新、非刷新狀態(tài) (刷新小圓圈在下拉懸停狀態(tài)時進(jìn)入全非狀態(tài),待刷新完成后自動收回,這個過程應(yīng)避免人為干預(yù)造成卡頓,而刷新、和非刷新狀態(tài)人為拉動時都會干預(yù)到小圓圈的contentoffset所以要屏蔽掉)
非刷新狀態(tài)邏輯
刷新狀態(tài)邏輯
刷新
動畫效果
動畫結(jié)束后回到最初角度
結(jié)束刷新
到此基本刷新邏輯已經(jīng)完成了 ,還有一些結(jié)束刷新時的操作就不在這里贅述了,demo里面有詳細(xì)的解析,有什么不合理的地方還望大家指出。
demo鏈接:
使用方法在 該鏈接的ReadMe里
喜歡的話請在github給顆小星星哦????!
首先說一下:UIActivityIndicator作為刷新控件
主要實(shí)現(xiàn)方法如下:
下拉刷新01-默認(rèn)
下拉刷新02-動畫圖片
下拉刷新03-隱藏時間
下拉刷新04-隱藏狀態(tài)和時間
下拉刷新05-自定義文字
下拉刷新06-自定義刷新控件
上拉刷新01-默認(rèn)
上拉刷新02-動畫圖片
上拉刷新03-隱藏刷新狀態(tài)的文字
上拉刷新04-全部加載完畢
上拉刷新05-自定義文字
上拉刷新06-加載后隱藏
上拉刷新07-自動回彈的上拉01
上拉刷新08-自動回彈的上拉02
上拉刷新09-自定義刷新控件(自動刷新)
上拉刷新10-自定義刷新控件(自動回彈)
最近利用 MJRefresh 做了一個下拉刷新和上拉加載的動畫,先上效果圖:
如果該類繼承自 MJRefreshAutoGifFooter 類,則父類方法 - (void)placeSubviews NS_REQUIRES_SUPER; 實(shí)現(xiàn)如下:
如果創(chuàng)建的上拉加載gif類繼承自 MJRefreshAutoGifFooter ,則加載效果如下,其中的文字提示可以通過重寫父類方法 - (void)placeSubviews NS_REQUIRES_SUPER; 設(shè)置 self.stateLabel.hidden = YES; 隱藏掉。
Loren Brichter 在 Tweetie 2 中實(shí)現(xiàn)了「下拉刷新」的機(jī)制,Tweetie 1 中也已經(jīng)有了類似的雛形(一個按鈕,而不是直接的下拉觸發(fā)操作)。下拉刷新這個操作最早由Tweetie創(chuàng)始人洛倫?布里切特(Loren Brichter)發(fā)明。
在此之后,很多以 news feed 為主的移動客戶端都相繼采用了這個設(shè)計,現(xiàn)在也基本成為了類似移動應(yīng)用的標(biāo)配。
Loren Brichter 為「下拉刷新」申請了專利,但他很愿意看到這個機(jī)制被其他 app 采用,也曾經(jīng)說過申請是防御性的。
Tweetie 是 Twitter 第三方客戶端,后來被 Twitter 收購,Loren Brichter 也成為 Twitter 員工(現(xiàn)已離開)。
下拉刷新:
到現(xiàn)在已經(jīng)非常廣泛地在各種應(yīng)用中使用,Sparrow、Facebook、新浪微博、甚至是iOS原生系統(tǒng)也都在使用這種方 式。有理論認(rèn)為,下拉刷新是一種適用于按照從新到舊的時間順序排列feeds的應(yīng)用,在這種應(yīng)用場景中看完舊的內(nèi)容時,用戶會很自然地下拉查找更新的內(nèi)容。
因此下拉刷新就顯得非常合理。隨著下拉刷新這種方式的不斷演變,下拉刷新已經(jīng)跳出基礎(chǔ)功能,成為一種表現(xiàn)品牌、表現(xiàn)設(shè)計感的元素,本文主要介紹幾款有意思的下拉刷新。
在收集過程 中發(fā)現(xiàn),有一些應(yīng)用是把應(yīng)用類型巧妙地融合到了下拉刷新中;有很多應(yīng)用的下拉刷新都是滲透了品牌元素,包括logo的顏色、icon的形狀等等,另外還有 一些就比較特別,是結(jié)合整個應(yīng)用的風(fēng)格去做了一些創(chuàng)新。
uexWindow.setBounce("1");
uexWindow.notifyBounceEvent("1", "1");
uexWindow.notifyBounceEvent("0", "1");
var s =
'{"imagePath":"","textColor":"#aaa","levelText":"","pullToReloadText":"上
拉加載更多內(nèi)容...","releaseToReloadText":"釋放加載更多內(nèi)容...","loadingText":"加載中,請稍
等"}';
uexWindow.setBounceParams("1", s);
uexWindow.showBounceView("1", '#EAEAEA', '1');
var b =
'{"imagePath":"","textColor":"#aaa","levelText":"","pullToReloadText":"下
拉刷新更多內(nèi)容...","releaseToReloadText":"釋放加載更多內(nèi)容...","loadingText":"刷新中,請稍
等"}';
uexWindow.setBounceParams("0", b);
uexWindow.showBounceView("0", '#EAEAEA', '1');
1 實(shí)現(xiàn)tableview的下拉刷新
2
3 tableview滑動就會觸發(fā)這個方法?
4 */
5 -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
6 {
7 //當(dāng)tableview下拉到最后一行的時候才觸發(fā)
8 if (indexPath.row == self.m_data.count - 1) {
9
10 //定義一個UIView
11 UIView *footSpinnerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 60.0f)];
12
13 //頂一個有刷新圖標(biāo)的view
14 UIActivityIndicatorView *activity = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(130.0f, 0.0f, 60.0f, 60.0f)];
15 activity.color = [UIColor redColor];
16 [activity startAnimating];//啟動有刷新圖標(biāo)的view
17
18 footSpinnerView.backgroundColor = [UIColor grayColor];
19 [footSpinnerView addSubview:activity];
20
21 //設(shè)置footerview
22 self.myTableView.tableFooterView = footSpinnerView;
23
24 // self.myTableView.tableHeaderView = footSpinnerView;
25
26 dispatch_queue_t queue = dispatch_queue_create("my queue", nil);
27
28 //在后臺線程添加數(shù)據(jù)
29 dispatch_async(queue, ^(void){
30
31 [self.m_data addObject:@"1000"];
32 [self.m_data addObject:@"1001"];
33 [self.m_data addObject:@"1002"];
34 [self.m_data addObject:@"1003"];
35 [self.m_data addObject:@"1004"];
36
37 });
38
39 //添加完數(shù)據(jù)就重新加載數(shù)據(jù)
40 dispatch_async(queue, ^(void) {
41
42 sleep(2);
43 dispatch_sync(dispatch_get_main_queue(), ^(void){
44
45 [self.myTableView reloadData];
46 });
47 });
48
49 // [self.myTableView reloadData];
50 dispatch_release(queue);
51 [footSpinnerView release];
52 [activity release];
53 }
54 // else if (indexPath.row == 0) {
55 //
56 // UIView *footSpinnerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 60.0f)];
57 // UIActivityIndicatorView *activity = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(130.0f, 0.0f, 60.0f, 60.0f)];
58 // activity.color = [UIColor redColor];
59 // [activity startAnimating];
60 //
61 // footSpinnerView.backgroundColor = [UIColor grayColor];
62 // [footSpinnerView addSubview:activity];
63 //
64 // // self.myTableView.tableFooterView = footSpinnerView;
65 //
66 // self.myTableView.tableHeaderView = footSpinnerView;
67 //
68 // dispatch_queue_t queue = dispatch_queue_create("my queue", nil);
69 //
70 // dispatch_async(queue, ^(void){
71 //
72 // [self.m_data insertObject:@"1000" atIndex:0];
73 //// [self.m_data addObject:@"1001"];
74 //// [self.m_data addObject:@"1002"];
75 //// [self.m_data addObject:@"1003"];
76 //// [self.m_data addObject:@"1004"];
77 // // [self.m_data insertObject:[NSArray arrayWithObject:@"01"] atIndex:0];
78 //
79 // });
80 //
81 // dispatch_async(queue, ^(void) {
82 //
83 // sleep(2);
84 // dispatch_sync(dispatch_get_main_queue(), ^(void){
85 //
86 // [self.myTableView reloadData];
87 // [self.myTableView scrollToRowAtIndexPath:[indexPath initWithIndex:3] atScrollPosition:UITableViewScrollPositionNone animated:YES];
88 // });
89 // });
90 //
91 //
92 // dispatch_release(queue);
93 // [footSpinnerView release];
94 // [activity release];
95 // }
96
97 //如果不是最后一行,則把footerview和headerview都設(shè)為nil
98 else
99 {
100 self.myTableView.tableFooterView = nil;
101 self.myTableView.tableHeaderView = nil;
102 }
103 }