egotableviewpullegorefresh下载拉刷新只能用xcode6版本吗

iOS下拉刷新上拉加载更多EGOTableViewPullRefresh类库
iOS下拉刷新上拉加载更多EGOTableViewPullRefresh类库
发布时间: 20:49:28
编辑:www.fx114.net
本篇文章主要介绍了"iOS下拉刷新上拉加载更多EGOTableViewPullRefresh类库",主要涉及到iOS下拉刷新上拉加载更多EGOTableViewPullRefresh类库方面的内容,对于iOS下拉刷新上拉加载更多EGOTableViewPullRefresh类库感兴趣的同学可以参考一下。
在一个项目开发过程中为了更好的体验经常会用到下拉刷新更新数据,当然也伴随一些上拉加载更多数据的情况;当前比较火的EGOTableViewPullRefresh只实现了下拉功能,而没有上拉的功能。这里介绍一个同时集成下拉刷新和上拉加载更多的类库EGOTableViewPullRefresh
英文原文和类库下载地址:
附带 Demo效果
Whats different on this fork:
容易集成,使用interface builder 添加tableView进行配置。
配置简单, 箭头头像,背景颜色和文本颜色都能通过PullTableView类的属性很容易的更改。 &
上拉加载更多数据功能在Table的底部。
可以通过代码修改刷新和加载更多动画。
The fast setup:
添加 QuartzCore.framework 到你的工程中。
将 EGOTableViewPullRefresh 拖到你的工程目录下。
查看 PullTableView.h 文件可用的属性。
添加一个PullTableView 到你代码中,实现PullTableViewDelegate委托方法。
The detailed setup (Walk through for creating the demo project):
创建一个新的xcode工程
选择 View Based Application 模板(xcode 4.2以后版本是 Single View Application模板)
工程名字 EGOTableViewPullRefreshDemo
在工程文件下创建EGOTableViewPullRefreshDemoViewController控制器类(Single View Application模板不需这步)
添加 QuartzCore.framework 到工程中
添加 PullTableView 到工程里:
拖拽 EGOTableViewPullRefresh 目录下文件到工程支持的文件组下,确保(EGOTableViewPullRefresh)下文件都拷贝到目标文件组下。
添加 PullTable 视图到 EGOTableViewPullRefreshDemoViewController.xib上:
拖一个UITableView控件到View视图上.
打开 Identity inspector 将Table 的继承类由 &UITableView 改成PullTableView
连接 dataSources数据源和 pullDelegate协议到PullTableView的 File's owner上
配置视图控制器的头文件 EGOTableViewPullRefreshDemoViewController.h:
添加 #import &PullTableView.h&
声明 PullTableViewDelegate 和 UITableViewDataSource协议
创建一个属性名为pullTableView的输出口连接到interface Builder上的tableView上
配置视图控制器和页脚 EGOTableViewPullRefreshDemoViewController.m
在.m文件中添加下面代码
mark - Refresh and load more methods
refreshTable
&&&&self.pullTableView.pullLastRefreshDate
= [NSDate date];
&&&&self.pullTableView.pullTableIsRefreshing
loadMoreDataToTable
&&&&self.pullTableView.pullTableIsLoadingMore
mark - UITableViewDataSource
(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
&&&&return&5;
(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
&&&&return&10;
(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
&&&&static&NSString
*cellIdentifier = @&Cell&;
&&&&UITableViewCell
*cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
&&&&if(!cell)
&&&&&&&&cell
= [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
&&&&cell.textLabel.text
= [NSString stringWithFormat:@&Row
indexPath.row];
&&&&return&
(NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
&&&&return&[NSString
stringWithFormat:@&Section
%i begins here!&,
(NSString *) tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
&&&&return&[NSString
stringWithFormat:@&Section
%i ends here!&,
mark - PullTableViewDelegate
(void)pullTableViewDidTriggerRefresh:(PullTableView
*)pullTableView
performSelector:@selector(refreshTable) withObject:nil afterDelay:3.0f];
(void)pullTableViewDidTriggerLoadMore:(PullTableView
*)pullTableView
performSelector:@selector(loadMoreDataToTable) withObject:nil afterDelay:3.0f];
对于UI的配置,在ViewDidLoad()方法里面添加下面代码(比如 修改刷新和上拉的背景色箭头头像等)
self.pullTableView.pullArrowImage
= [UIImage imageNamed:@&blackArrow&];
self.pullTableView.pullBackgroundColor
= [UIColor yellowColor];
self.pullTableView.pullTextColor
= [UIColor blackColor];
对于手动设置动画可使用 pullTableIsRefreshing 和pullTableIsLoadingMore 属性. 比如在 viewWillAppear:方法里面添加下面的代码
if(!self.pullTableView.pullTableIsRefreshing)
&&&&self.pullTableView.pullTableIsRefreshing
performSelector:@selector(refreshTable) withObject:nil afterDelay:3];
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:IOS学习日志---1:TableView下拉刷新以及各种失败问题总结 - 推酷
IOS学习日志---1:TableView下拉刷新以及各种失败问题总结
& & & & & 今天尝试了下IOS中的下拉刷新,遇到各种各样的问题,写一篇日志做一个总结。
一、下拉刷新的实现 & & & & &
& & & & & &首先IOS是没有自带下拉刷新的,虽然我们平时遇到大量APP是具有下拉刷新功能,但是很不幸,IOS的确没有做下拉刷新。而我们平时看到的大部分下拉刷新都是采用第三方库:
EGORefreshTableHeaderView
& & & & & &下载地址为:
& & & & & &和大部分第三方库一样,zip展开后其中带有一个demo和一个库文件夹,如果要详细了解,建议先看看demo。其实这个第三方的用法也相当简单:
& & & & & &1. 将第三方库中的库文件夹拖到XCode中,并且选择拷贝。由于EGOTableViewPullRefresh依赖于IOS的QuartzCore.frameworks,所以别忘了加上。
& &2. 在你自己的TableViewController中import入
EGORefreshTableHeaderView.h
& &3. 在头文件中加入以下代码,其中reloadTableViewDataSource是在下拉松开后,会调用的代码,而doneLoadingTableViewData是刷新成功之后调用的代码,主要用于隐藏table上面的下拉区域。
EGORefreshTableHeaderView *_refreshHeaderV
-(void)reloadTableViewDataS
-(void)doneLoadingTableViewD
& & & & & &4. 在m文件中初始化下拉刷新:
//初始化下拉刷新
if(_refreshHeaderView ==nil){
EGORefreshTableHeaderView *view =[[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - self.tableView.bounds.size.height, self.view.frame.size.width, self.tableView.bounds.size.height)];
view.delegate =
[self.tableView addSubview:view];
_refreshHeaderView =
update the last update date
[_refreshHeaderView refreshLastUpdatedDate];
& & & & & &5. 在m文件中实现以下方法:
#pragma mark Data Source Loading / Reloading Methods
-(void)reloadTableViewDataSource{
should be calling your tableviews data source model to reload
put here just for demo
_reloading =YES;
-(void)doneLoadingTableViewData{
model should call this when its done loading
_reloading =NO;
[_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];
#pragma mark -
#pragma mark UIScrollViewDelegate Methods
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
[_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
[_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];
#pragma mark -
#pragma mark EGORefreshTableHeaderDelegate Methods
-(void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{
[self reloadTableViewDataSource];
[self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:3.0];
-(BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{
return _ // should return if data source model is reloading
-(NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{
return [NSDate date]; // should return date data source was last changed
其中,我们可以看到,其实下拉刷新是触发了egoRefreshTableHeaderDidTriggerRefresh,而其中做了两件事情,一件是启动需要刷新的动作,这个需要用户我们定义完善reloadTableViewDataSource。第二件事情是设定3秒后调用doneLoadingTableViewData,当然我们可以在任何地方调用doneLoadingTableViewData来关闭下拉区域,这里是避免长时间无响应,约定一个最大时间。
(doneLoadingTableViewData可以连续多次调用,但是效果只有一次)
& & & & &此时你已经可以运行代码,会发现,已经成功地添加了一个下拉功能,当然,具体如何刷新,那是需要自己去维护。
二、下拉刷新失败的问题
& & & & 第一个可能失败的问题是,主线程与非主线程中刷新UI。一般来说IOS是不支持在非主线程中刷新UI的,会造成各种各样的问题导致程序崩溃。因此,如果下拉刷新是一个耗时操作,又是先分线程中进行的(比如发送HTTP Request向服务器发送请求获取数据,在数据成功返回后刷新UI),那么就需要将刷新过程放入一个函数,在分线程中调用
performSelectorOnMainThread
(refreshTable)
withObject
waitUntilDone
];告诉主线程如何刷新UI。其中,refreshTable为刷新函数。
& & 第二个问题,纠结了好久是有关自定义TableViewController中的cell刷新。用IB定义了cell的外观,并且为cell中的所有view都用tag标记。需要采用来刷新:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @&PrivateMessageCell&;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
// Configure the cell...
PrivateMessageListItem *item = (PrivateMessageListItem *)[privateMessageList objectAtIndex:indexPath.row];
//用户头像
UIImageView *objectProfileImage = (UIImageView *)[cell viewWithTag:1000];
[objectProfileImage setImageWithURL:[NSURL URLWithString: item.contacter_info.pic]];
其中千万别采用[self.view viewWithTag: 1000]来获取元素。这种方法能成功load数据,但是第二次刷新的时候就不会成功。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致EGOTableViewPullRefresh
下拉刷新 - 不积跬步 无以至千里 不积小流 无以成江海 - ITeye技术网站
博客分类:
openSource:/enormego/EGOTableViewPullRefresh
里面有demo
1、下载EGORefreshTableHeaderView开源框架。
2、往应用中添加EGORefreshTableHeaderView.h文件、EGORefreshTableHeaderView.m文件和Resource目录,并且导入QuartzCore.framework
3、添加代码
在tableview对应的类的h文件中添加如下代码
#import "EGORefreshTableHeaderView.h"
添加接口 EGORefreshTableHeaderDelegate
@property (strong, nonatomic) EGORefreshTableHeaderView *refreshHeaderV
@property (assign, nonatomic)BOOL
- (void)reloadTableViewDataS
- (void)doneLoadingTableViewD
在m文件中:
往viewDidLoad函数里添加如下代码(自己微调)
if (refreshHeaderView == nil)
// 创建下拉视图
EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - myTableView.bounds.size.height, self.view.frame.size.width, myTableView.bounds.size.height)];
view.delegate = self;
[myTableView addSubview:view];
refreshHeaderView =
// 更新时间
[refreshHeaderView refreshLastUpdatedDate];
再添加一些事件函数
#pragma mark -
#pragma mark Data Source Loading / Reloading Methods
// 刷新开始时调用
- (void)reloadTableViewDataSource
should be calling your tableviews data source model to reload
put here just for demo
在这添加自己代码
[self resetSearch];
reloading = YES;
// 刷新结束时调用
- (void)doneLoadingTableViewData
model should call this when its done loading
在这添加自己代码
search.text = @"";
[myTableView reloadData];
[search resignFirstResponder];
reloading = NO;
[refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:myTableView];
#pragma mark -
#pragma mark UIScrollViewDelegate Methods
// 页面滚动时回调
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
//NSLog(@"scrollViewDidScroll");
[refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];
// 滚动结束时回调
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
//NSLog(@"scrollViewDidEndDragging");
[refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];
#pragma mark -
#pragma mark EGORefreshTableHeaderDelegate Methods
// 开始刷新时回调
- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view
NSLog(@"egoRefreshTableHeaderDidTriggerRefresh");
[self reloadTableViewDataSource];
[self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:1.0];
// 下拉时回调
- (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view
NSLog(@"egoRefreshTableHeaderDataSourceIsLoading");
return reloading; // should return if data source model is reloading
// 请求上次更新时间时调用
- (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view
NSLog(@"egoRefreshTableHeaderDataSourceLastUpdated");
return [NSDate date]; // should return date data source was last changed
最后更具自己需求修改源代码的,如样式,时间格式等
BTW:下面2个地址用到这个代码
/blog/1629364
这里有基于这个代码的下拉刷新 http://blog.csdn.net/linzhu0831/article/details/7547337
(849.9 KB)
下载次数: 64
浏览: 2382785 次
来自: China
史上最详细的iOS之事件的传递和响应机制-原理篇http:// ...
事件的传递和响应的区别:事件的传递是从上到下(父控件到子控件) ...
如何做到一个事件多个对象处理:因为系统默认做法是把事件上抛给父 ...
触摸事件处理的整体过程1&用户点击屏幕后产生的一个触摸事 ...
想让谁成为最合适的view就重写谁自己的父控件的hitTest ...posts - 38,&
comments - 0,&
trackbacks - 0
& 今天尝试了下IOS中的下拉刷新,遇到各种各样的问题,写一篇日志做一个总结。
一、下拉刷新的实现 & & & & &
& & & & & &首先IOS是没有自带下拉刷新的,虽然我们平时遇到大量APP是具有下拉刷新功能,但是很不幸,IOS的确没有做下拉刷新。而我们平时看到的大部分下拉刷新都是采用第三方库:EGORefreshTableHeaderView
& & & & & &下载地址为:
& & & & & &和大部分第三方库一样,zip展开后其中带有一个demo和一个库文件夹,如果要详细了解,建议先看看demo。其实这个第三方的用法也相当简单:
& & & & & &1. 将第三方库中的库文件夹拖到XCode中,并且选择拷贝。由于EGOTableViewPullRefresh依赖于IOS的QuartzCore.frameworks,所以别忘了加上。
& &2. 在你自己的TableViewController中import入EGORefreshTableHeaderView.h
& &3. 在头文件中加入以下代码,其中reloadTableViewDataSource是在下拉松开后,会调用的代码,而doneLoadingTableViewData是刷新成功之后调用的代码,主要用于隐藏table上面的下拉区域。
&&&&EGORefreshTableHeaderView&*_refreshHeaderV&&
&&&&BOOL&_&&
-(void)reloadTableViewDataS&&
-(void)doneLoadingTableViewD&&
& & & & & &4. 在m文件中初始化下拉刷新:
if(_refreshHeaderView&==nil){&&
&&&&EGORefreshTableHeaderView&*view&=[[EGORefreshTableHeaderView&alloc]&initWithFrame:CGRectMake(0.0f,&0.0f&-&self.tableView.bounds.size.height,&self.view.frame.size.width,&self.tableView.bounds.size.height)];&&
&&&&view.delegate&=&&&
&&&&[self.tableView&addSubview:view];&&
&&&&_refreshHeaderView&=&&&
[_refreshHeaderView&refreshLastUpdatedDate];&&
& & & & & &5. 在m文件中实现以下方法:
#pragma&mark&Data&Source&Loading&/&Reloading&Methods&&
-(void)reloadTableViewDataSource{&&
&&&&_reloading&=YES;&&
-(void)doneLoadingTableViewData{&&
&&&&_reloading&=NO;&&
&&&&[_refreshHeaderView&egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];&&
#pragma&mark&-&&
#pragma&mark&UIScrollViewDelegate&Methods&&
-(void)scrollViewDidScroll:(UIScrollView&*)scrollView{&&
&&&&[_refreshHeaderView&egoRefreshScrollViewDidScroll:scrollView];&&
-(void)scrollViewDidEndDragging:(UIScrollView&*)scrollView&willDecelerate:(BOOL)decelerate{&&
&&&&[_refreshHeaderView&egoRefreshScrollViewDidEndDragging:scrollView];&&
#pragma&mark&-&&
#pragma&mark&EGORefreshTableHeaderDelegate&Methods&&
-(void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{&&
&&&&[self&reloadTableViewDataSource];&&
&&&&[self&performSelector:@selector(doneLoadingTableViewData)&withObject:nil&afterDelay:3.0];&&
-(BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{&&
&&&&return&_&&&
-(NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{&&
&&&&return&[NSDate&date];&
& & & 其中,我们可以看到,其实下拉刷新是触发了egoRefreshTableHeaderDidTriggerRefresh,而其中做了两件事情,一件是启动需要刷新的动作,这个需要用户我们定义完善reloadTableViewDataSource。第二件事情是设定3秒后调用doneLoadingTableViewData,当然我们可以在任何地方调用doneLoadingTableViewData来关闭下拉区域,这里是避免长时间无响应,约定一个最大时间。(doneLoadingTableViewData可以连续多次调用,但是效果只有一次)
& & & & &此时你已经可以运行代码,会发现,已经成功地添加了一个下拉功能,当然,具体如何刷新,那是需要自己去维护。
二、下拉刷新失败的问题
& & & & 第一个可能失败的问题是,主线程与非主线程中刷新UI。一般来说IOS是不支持在非主线程中刷新UI的,会造成各种各样的问题导致程序崩溃。因此,如果下拉刷新是一个耗时操作,又是先分线程中进行的(比如发送HTTP Request向服务器发送请求获取数据,在数据成功返回后刷新UI),那么就需要将刷新过程放入一个函数,在分线程中调用
[selfperformSelectorOnMainThread:@selector(refreshTable)withObject:nilwaitUntilDone:NO];告诉主线程如何刷新UI。其中,refreshTable为刷新函数。
& & 第二个问题,纠结了好久是有关自定义TableViewController中的cell刷新。用IB定义了cell的外观,并且为cell中的所有view都用tag标记。需要采用来刷新:
-&(UITableViewCell&*)tableView:(UITableView&*)tableView&cellForRowAtIndexPath:(NSIndexPath&*)indexPath&&
&&&&static&NSString&*CellIdentifier&=&@"PrivateMessageCell";&&
&&&&UITableViewCell&*cell&=&[tableView&dequeueReusableCellWithIdentifier:CellIdentifier&forIndexPath:indexPath];&&
&&&&PrivateMessageListItem&*item&=&(PrivateMessageListItem&*)[privateMessageList&objectAtIndex:indexPath.row];&&
&&&&UIImageView&*objectProfileImage&=&(UIImageView&*)[cell&viewWithTag:1000];&&
&&&&[objectProfileImage&setImageWithURL:[NSURL&URLWithString:&item.contacter_info.pic]];&&
&&&&return&&&
其中千万别采用[self.view viewWithTag: 1000]来获取元素。这种方法能成功load数据,但是第二次刷新的时候就不会成功。
阅读(...) 评论()20782人阅读
菜鸟学iOS的笔记(76)
---------------------------------------------------------------------------------------------------------------------------
考虑到还会有很多童鞋会看到该Blog,在此做一个说明,开源中国iOS开源客户端源码已做重构,请下载最新的源码学习(注:本Blog不一定适用与新的代码学习)。
新repo地址:。
另外,这篇Blog收集了一些其他社区的客户端源码,源码也正在不断更新中,有的也上架appstore。
访问地址:
---------------------------------------------------------------------------------------------------------------------------
打开开源中国iOS客户端应用程序第一步就是加载数据,经常我们在第二次以后打开的时候,我们界面显示的是上一次更新的数据,此时我们想看最新内容就需要去刷新数据加载这些内容,加载需要一个等待过程,如何能让用户在等待过程中不焦急,能够等待这个过程完成,这就需要给用户一个心里安慰,让用户知道该软件正在很努力很努力的执行自己命令,这就需要我们为自己应用程序添加一些特效;
& & & 开源中国iOS客户端用到了不少特效,这些特效在当前很多应用软件中都比较流行,基本上这些特效都属于第三方类库,本次想说的是下拉刷新特效,EGOTableViewPullRefresh最开始是在Twitter中使用,最后做了开源,然后很多应用添加这个特效,常作为加载数据时将等待时间作为一个动画来过渡;
下拉刷新类库EGOTableViewPullRefresh资源文件下载地址:
先这个特效的效果图
在EGOTableViewPullRefresh资源文件中有两个文件,.m和.h文件,还有资源图片,就是下拉刷新箭头
资源图片一共4种色,可以根据喜好选用不同色的箭头,只需在EGORefreshTableHeaderView.m文件中修改一下。按照大小尺寸又可分两种,较大尺寸是用于iPad上使用的。
针对这些第三方类库,我们没必要去深入研究它们内部实现机制原理,只要知道怎么用就可以。不过,看一看别人实现原理,学学别人的方法还是很不错的,了解下人家牛人程序是怎么写的;
EGORefreshTableHeaderView.h
#import &UIKit/UIKit.h&
#import &QuartzCore/QuartzCore.h&
typedef enum{
EGOOPullRefreshPulling = 0,
EGOOPullRefreshNormal,
EGOOPullRefreshLoading,
} EGOPullRefreshS
@protocol EGORefreshTableHeaderD
@interface EGORefreshTableHeaderView : UIView {
EGOPullRefreshState _
UILabel *_lastUpdatedL
UILabel *_statusL
CALayer *_arrowI
UIActivityIndicatorView *_activityV
@property(nonatomic,assign) id &EGORefreshTableHeaderDelegate&
- (id)initWithFrame:(CGRect)frame arrowImageName:(NSString *)arrow textColor:(UIColor *)textC
- (void)refreshLastUpdatedD
- (void)egoRefreshScrollViewDidScroll:(UIScrollView *)scrollV
- (void)egoRefreshScrollViewDidEndDragging:(UIScrollView *)scrollV
- (void)egoRefreshScrollViewDataSourceDidFinishedLoading:(UIScrollView *)scrollV
//定义协议方法
@protocol EGORefreshTableHeaderDelegate
//下拉的时候调用此方法
- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)
//判断刷新状态情况,正在刷新或者是没刷新
- (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)
//返回刷新时间,回调方法
- (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)
首先是定义了一个枚举类型EGOPullRefreshState表示当前我们操作在哪种状态下,有下拉状态、正常状态、数据加载状态;
@protocol EGORefreshTableHeaderD表示声明有这个协议,该协议里面声明了一些方法,只要其他的类遵循了这个协议(也就是遵循了它的规定),就可以去实现协议里面方法,协议里的方法是留给遵循这个协议的类去实现的,也是留给外部实现接口;
EGORefreshTableHeaderView成员变量定义两个label用于提示下拉过程所处状态,和显示的刷新时间。定义的CALayer类对象装载显示图片。UIActivityIndicatorView类对象显示一个等待动画;
@property(nonatomic,assign)id
&EGORefreshTableHeaderDelegate&声明一个协议对象;
接着下面的是EGORefreshTableHeaderView类成员函数,用于实现类库中下拉刷新的效果;
最后定义了4个协议方法,其中最后一个协议方法为可选实现;
下面是EGORefreshTableHeaderView.m文件,想说的都在注释里
#import &EGORefreshTableHeaderView.h&
#define TEXT_COLOR
[UIColor colorWithRed:87.0/255.0 green:108.0/255.0 blue:137.0/255.0 alpha:1.0]
#define FLIP_ANIMATION_DURATION 0.18f
//设置的一个私有接口,只能本类来使用
@interface EGORefreshTableHeaderView (Private)
- (void)setState:(EGOPullRefreshState)aS
@implementation EGORefreshTableHeaderView
@synthesize delegate=_
//初始化框架属性,
- (id)initWithFrame:(CGRect)frame arrowImageName:(NSString *)arrow textColor:(UIColor *)textColor
if((self = [super initWithFrame:frame])) {
self.view自动适应bounds的宽度
self.autoresizingMask = UIViewAutoresizingFlexibleW
self.view背景色和透明度设置
self.backgroundColor = [UIColor colorWithRed:226.0/255.0 green:231.0/255.0 blue:237.0/255.0 alpha:1.0];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, frame.size.height - 30.0f, self.frame.size.width, 20.0f)];
label.autoresizingMask = UIViewAutoresizingFlexibleW
label.font = [UIFont systemFontOfSize:12.0f];
label.textColor = textC
label文本阴影颜色
label.shadowColor = [UIColor colorWithWhite:0.9f alpha:1.0f];
label.shadowOffset = CGSizeMake(0.0f, 1.0f);
label.backgroundColor = [UIColor clearColor];
label.textAlignment = UITextAlignmentC
[self addSubview:label];
_lastUpdatedLabel=
[label release];
label = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, frame.size.height - 48.0f, self.frame.size.width, 20.0f)];
label.autoresizingMask = UIViewAutoresizingFlexibleW
label.font = [UIFont boldSystemFontOfSize:13.0f];
label.textColor = textC
label.shadowColor = [UIColor colorWithWhite:0.9f alpha:1.0f];
label.shadowOffset = CGSizeMake(0.0f, 1.0f);
label.backgroundColor = [UIColor clearColor];
label.textAlignment = UITextAlignmentC
[self addSubview:label];
_statusLabel=
[label release];
CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(25.0f, frame.size.height - 65.0f, 30.0f, 55.0f);
设置layer在view上以某种形式适应
layer.contentsGravity = kCAGravityResizeA
layer.contents = (id)[UIImage imageNamed:arrow].CGI
判断设备版本,因为一些iOS特性是在最后新增的,要求设备配置高一些,所以做一下判断
#if __IPHONE_OS_VERSION_MAX_ALLOWED &= 40000
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
layer.contentsScale = [[UIScreen mainScreen] scale];
[[self layer] addSublayer:layer];
_arrowImage=
UIActivityIndicatorView *view = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
view.frame = CGRectMake(25.0f, frame.size.height - 38.0f, 20.0f, 20.0f);
[self addSubview:view];
_activityView =
[view release];
[self setState:EGOOPullRefreshNormal];
//初始化当前视图的frame
- (id)initWithFrame:(CGRect)frame
return [self initWithFrame:frame arrowImageName:@&blueArrow.png& textColor:TEXT_COLOR];
#pragma mark -
#pragma mark Setters
//获取最后一次更新的时间
- (void)refreshLastUpdatedDate {
if ([_delegate respondsToSelector:@selector(egoRefreshTableHeaderDataSourceLastUpdated:)]) {
NSDate *date = [_delegate egoRefreshTableHeaderDataSourceLastUpdated:self];
NSDateFormatter实例创建字符串,来表示NSDate和NSCalendarDate对象,已预订格式化字符串输出
[NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehaviorDefault];
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
设置日期输出格式
[dateFormatter setDateStyle:NSDateFormatterShortStyle];
设置时间显示格式
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
_lastUpdatedLabel.text = [NSString stringWithFormat:@&Last Updated: %@&, [dateFormatter stringFromDate:date]];
_lastUpdatedLabel.text = [NSString stringWithFormat:@&最后更新: %@&, [dateFormatter stringFromDate:date]];
存储_lastUpdatedLabel.text内容,放到字典中
[[NSUserDefaults standardUserDefaults] setObject:_lastUpdatedLabel.text forKey:@&EGORefreshTableView_LastRefresh&];
将NSUserDefaults存储数据放到磁盘
[[NSUserDefaults standardUserDefaults] synchronize];
_lastUpdatedLabel.text =
- (void)setState:(EGOPullRefreshState)aState{
switch (aState) {
/*触摸屏幕下拉状态*/
case EGOOPullRefreshPulling:
_statusLabel.text = NSLocalizedString(@&Release to refresh...&, @&Release to refresh status&);
_statusLabel.text = @&松开即可刷新&;
设置下拉刷新过程,箭头的图片的一个动画过程
[CATransaction begin];
[CATransaction setAnimationDuration:FLIP_ANIMATION_DURATION];
下拉刷新箭头一个翻转过程,(M_PI / 180.0)是角度转换为弧度
_arrowImage.transform = CATransform3DMakeRotation((M_PI / 180.0) * 180.0f, 0.0f, 0.0f, 1.0f);
[CATransaction commit];
/*刚开始触摸屏幕准备下拉的时候的状态*/
case EGOOPullRefreshNormal:
if (_state == EGOOPullRefreshPulling) {
[CATransaction begin];
[CATransaction setAnimationDuration:FLIP_ANIMATION_DURATION];
_arrowImage.transform = CATransform3DI
[CATransaction commit];
_statusLabel.text = NSLocalizedString(@&Pull down to refresh...&, @&Pull down to refresh status&);
_statusLabel.text = @&下拉可以刷新&;
[_activityView stopAnimating];
[CATransaction begin];
因为下拉刷新完成好就不需要下拉动画,此时_activityView动画显示
显示事物关闭动画效果 kCFBooleanTrue关闭 kCFBooleanFalse开启
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
_arrowImage.hidden = NO;
_arrowImage.transform = CATransform3DI
[CATransaction commit];
更新下时间
[self refreshLastUpdatedDate];
/*触摸手指松开,完成下拉操作的状态*/
case EGOOPullRefreshLoading:
_statusLabel.text = NSLocalizedString(@&Loading...&, @&Loading Status&);
_statusLabel.text = @&加载中&;
[_activityView startAnimating];
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
_arrowImage.hidden = YES;
[CATransaction commit];
_state = aS
#pragma mark -
#pragma mark ScrollView Methods
- (void)egoRefreshScrollViewDidScroll:(UIScrollView *)scrollView {
if (_state == EGOOPullRefreshLoading) {
CGFloat offset = MAX(scrollView.contentOffset.y * -1, 0);
offset = MIN(offset, 60);
scrollView.contentInset = UIEdgeInsetsMake(offset, 0.0f, 0.0f, 0.0f);
} else if (scrollView.isDragging) {
BOOL _loading = NO;
if ([_delegate respondsToSelector:@selector(egoRefreshTableHeaderDataSourceIsLoading:)]) {
_loading = [_delegate egoRefreshTableHeaderDataSourceIsLoading:self];
if (_state == EGOOPullRefreshPulling && scrollView.contentOffset.y & -65.0f && scrollView.contentOffset.y & 0.0f && !_loading) {
[self setState:EGOOPullRefreshNormal];
} else if (_state == EGOOPullRefreshNormal && scrollView.contentOffset.y & -65.0f && !_loading) {
[self setState:EGOOPullRefreshPulling];
设置下拉属性scrollView框架恢复初始位置
if (scrollView.contentInset.top != 0) {
A UIEdgeInsets struct whose top, left, bottom, and right fields are all set to the value 0.
scrollView.contentInset = UIEdgeInsetsZ
- (void)egoRefreshScrollViewDidEndDragging:(UIScrollView *)scrollView {
BOOL _loading = NO;
if ([_delegate respondsToSelector:@selector(egoRefreshTableHeaderDataSourceIsLoading:)]) {
_loading = [_delegate egoRefreshTableHeaderDataSourceIsLoading:self];
if (scrollView.contentOffset.y &= - 65.0f && !_loading) {
if ([_delegate respondsToSelector:@selector(egoRefreshTableHeaderDidTriggerRefresh:)]) {
[_delegate egoRefreshTableHeaderDidTriggerRefresh:self];
[self setState:EGOOPullRefreshLoading];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.2];
scrollView.contentInset = UIEdgeInsetsMake(60.0f, 0.0f, 0.0f, 0.0f);
[UIView commitAnimations];
//数据加载完成后调用此方法
- (void)egoRefreshScrollViewDataSourceDidFinishedLoading:(UIScrollView *)scrollView {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:.3];
数据加载完成后,scrollView恢复位置大小
[scrollView setContentInset:UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, 0.0f)];
[UIView commitAnimations];
// 数据加载完成,
[self setState:EGOOPullRefreshNormal];
#pragma mark -
#pragma mark Dealloc
- (void)dealloc {
_delegate=
_activityView =
_statusLabel =
_arrowImage =
_lastUpdatedLabel =
[super dealloc];
当我们想使用这个下拉刷新类库的时候,在使用类里声明这个协议&EGORefreshTableHeaderDelegate&,把当前类self交付给下拉刷新库的协议对象,也就是xx.delegate=
怎样让其他类来使用这里面效果,这时我们就可以委托另一个类来实现协议的方法。
选中一个协议方法,右键选择Jump to Definition就可以看到哪些类被委托了,怎样使用了这个类的协议方法:
正在学习过程中,错误之处请指正,欢迎交流,共同学习;
欢迎转载分享,请注明出处
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2133183次
积分:14951
积分:14951
排名:第650名
原创:125篇
转载:23篇
评论:509条
51CTO 博客
关注我的微博
我们工作室微博
文章:15篇
阅读:340730
(1)(2)(4)(2)(5)(2)(6)(8)(6)(9)(1)(5)(19)(10)(4)(8)(13)(28)(16)(1)}

我要回帖

更多关于 egorefresh github 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信