重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
demo链接:
平顶山网站建设公司创新互联公司,平顶山网站设计制作,有大型网站制作公司丰富经验。已为平顶山近1000家提供企业网站建设服务。企业网站搭建\成都外贸网站建设要多少钱,请找那个售后服务好的平顶山做网站的公司定做!
喜欢的话请在github给颗小星星哦????!
先说一下用法,然后再说实现
使用方法很简单,导入头文件UIView+XDRefresh.h
用一个与下拉刷新小圆圈一样大小的scrollview,把其contentSize也置为同样大小,然后把下拉刷新的小圆圈放到scrollview上,这样在下拉刷新过程中只需要根据被观察者的下拉状态去改变这个scrollview的contentoffset.y即可实现小圆圈的上下移动,而不需要去渲染下拉小圆圈的frame
刷新过程主要分为三种状态
主要方法,通过kvo去观察tableview的下拉过程
实现观察者的代理 并在其中实现三种状态(非刷新,刷新,(全非)既不刷新也不非刷新)
全非状态时直接return 以屏蔽掉刷新、非刷新状态 (刷新小圆圈在下拉悬停状态时进入全非状态,待刷新完成后自动收回,这个过程应避免人为干预造成卡顿,而刷新、和非刷新状态人为拉动时都会干预到小圆圈的contentoffset所以要屏蔽掉)
非刷新状态逻辑
刷新状态逻辑
刷新
动画效果
动画结束后回到最初角度
结束刷新
到此基本刷新逻辑已经完成了 ,还有一些结束刷新时的操作就不在这里赘述了,demo里面有详细的解析,有什么不合理的地方还望大家指出。
demo链接:
使用方法在 该链接的ReadMe里
喜欢的话请在github给颗小星星哦????!
首先说一下:UIActivityIndicator作为刷新控件
主要实现方法如下:
下拉刷新01-默认
下拉刷新02-动画图片
下拉刷新03-隐藏时间
下拉刷新04-隐藏状态和时间
下拉刷新05-自定义文字
下拉刷新06-自定义刷新控件
上拉刷新01-默认
上拉刷新02-动画图片
上拉刷新03-隐藏刷新状态的文字
上拉刷新04-全部加载完毕
上拉刷新05-自定义文字
上拉刷新06-加载后隐藏
上拉刷新07-自动回弹的上拉01
上拉刷新08-自动回弹的上拉02
上拉刷新09-自定义刷新控件(自动刷新)
上拉刷新10-自定义刷新控件(自动回弹)
最近利用 MJRefresh 做了一个下拉刷新和上拉加载的动画,先上效果图:
如果该类继承自 MJRefreshAutoGifFooter 类,则父类方法 - (void)placeSubviews NS_REQUIRES_SUPER; 实现如下:
如果创建的上拉加载gif类继承自 MJRefreshAutoGifFooter ,则加载效果如下,其中的文字提示可以通过重写父类方法 - (void)placeSubviews NS_REQUIRES_SUPER; 设置 self.stateLabel.hidden = YES; 隐藏掉。
Loren Brichter 在 Tweetie 2 中实现了「下拉刷新」的机制,Tweetie 1 中也已经有了类似的雏形(一个按钮,而不是直接的下拉触发操作)。下拉刷新这个操作最早由Tweetie创始人洛伦•布里切特(Loren Brichter)发明。
在此之后,很多以 news feed 为主的移动客户端都相继采用了这个设计,现在也基本成为了类似移动应用的标配。
Loren Brichter 为「下拉刷新」申请了专利,但他很愿意看到这个机制被其他 app 采用,也曾经说过申请是防御性的。
Tweetie 是 Twitter 第三方客户端,后来被 Twitter 收购,Loren Brichter 也成为 Twitter 员工(现已离开)。
下拉刷新:
到现在已经非常广泛地在各种应用中使用,Sparrow、Facebook、新浪微博、甚至是iOS原生系统也都在使用这种方 式。有理论认为,下拉刷新是一种适用于按照从新到旧的时间顺序排列feeds的应用,在这种应用场景中看完旧的内容时,用户会很自然地下拉查找更新的内容。
因此下拉刷新就显得非常合理。随着下拉刷新这种方式的不断演变,下拉刷新已经跳出基础功能,成为一种表现品牌、表现设计感的元素,本文主要介绍几款有意思的下拉刷新。
在收集过程 中发现,有一些应用是把应用类型巧妙地融合到了下拉刷新中;有很多应用的下拉刷新都是渗透了品牌元素,包括logo的颜色、icon的形状等等,另外还有 一些就比较特别,是结合整个应用的风格去做了一些创新。
uexWindow.setBounce("1");
uexWindow.notifyBounceEvent("1", "1");
uexWindow.notifyBounceEvent("0", "1");
var s =
'{"imagePath":"","textColor":"#aaa","levelText":"","pullToReloadText":"上
拉加载更多内容...","releaseToReloadText":"释放加载更多内容...","loadingText":"加载中,请稍
等"}';
uexWindow.setBounceParams("1", s);
uexWindow.showBounceView("1", '#EAEAEA', '1');
var b =
'{"imagePath":"","textColor":"#aaa","levelText":"","pullToReloadText":"下
拉刷新更多内容...","releaseToReloadText":"释放加载更多内容...","loadingText":"刷新中,请稍
等"}';
uexWindow.setBounceParams("0", b);
uexWindow.showBounceView("0", '#EAEAEA', '1');
1 实现tableview的下拉刷新
2
3 tableview滑动就会触发这个方法?
4 */
5 -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
6 {
7 //当tableview下拉到最后一行的时候才触发
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 //顶一个有刷新图标的view
14 UIActivityIndicatorView *activity = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(130.0f, 0.0f, 60.0f, 60.0f)];
15 activity.color = [UIColor redColor];
16 [activity startAnimating];//启动有刷新图标的view
17
18 footSpinnerView.backgroundColor = [UIColor grayColor];
19 [footSpinnerView addSubview:activity];
20
21 //设置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 //在后台线程添加数据
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 //添加完数据就重新加载数据
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都设为nil
98 else
99 {
100 self.myTableView.tableFooterView = nil;
101 self.myTableView.tableHeaderView = nil;
102 }
103 }