H文件:
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
typedef enum{
EGOOPullRefreshPulling = 0,
EGOOPullRefreshNormal,
EGOOPullRefreshLoading,
} EGOPullRefreshState;
@protocol EGORefreshTableHeaderDelegate;
@interface EGORefreshTableHeaderView : UIView {
id _delegate;
EGOPullRefreshState _state;
UILabel *_lastUpdatedLabel;
UILabel *_statusLabel;
CALayer *_arrowImage;
UIActivityIndicatorView *_activityView;
}
@property(nonatomic,assign)id <EGORefreshTableHeaderDelegate> delegate;
- (void)refreshLastUpdatedDate;
- (void)egoRefreshScrollViewDidScroll:(UIScrollView *)scrollView;
- (void)egoRefreshScrollViewDidEndDragging:(UIScrollView *)scrollView;
- (void)egoRefreshScrollViewDataSourceDidFinishedLoading:(UIScrollView *)scrollView;
@end
@protocol EGORefreshTableHeaderDelegate
- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view;
- (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view;
@optional
- (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view;
@end
M文件:
#define RefreshViewHight 65.0f
#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)aState;
@end
@implementation EGORefreshTableHeaderView
@synthesize delegate=_delegate;
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame: frame];
if (self) {
self.autoresizingMask =UIViewAutoresizingFlexibleWidth;
self.backgroundColor = [UIColorcolorWithRed:226.0/255.0green:231.0/255.0blue:237.0/255.0alpha:1.0];
UILabel *label = [[UILabelalloc] initWithFrame:CGRectMake(0.0f,RefreshViewHight - 30.0f,self.frame.size.width,20.0f)];
label.autoresizingMask =UIViewAutoresizingFlexibleWidth;
label.font = [UIFontsystemFontOfSize:12.0f];
label.textColor =TEXT_COLOR;
label.shadowColor = [UIColorcolorWithWhite:0.9falpha:1.0f];
label.shadowOffset =CGSizeMake(0.0f,1.0f);
label.backgroundColor = [UIColorclearColor];
label.textAlignment =UITextAlignmentCenter;
[self addSubview:label];
_lastUpdatedLabel=label;
[label release];
label = [[UILabelalloc] initWithFrame:CGRectMake(0.0f,RefreshViewHight - 48.0f,self.frame.size.width,20.0f)];
label.autoresizingMask =UIViewAutoresizingFlexibleWidth;
label.font = [UIFontboldSystemFontOfSize:13.0f];
label.textColor =TEXT_COLOR;
label.shadowColor = [UIColorcolorWithWhite:0.9falpha:1.0f];
label.shadowOffset =CGSizeMake(0.0f,1.0f);
label.backgroundColor = [UIColorclearColor];
label.textAlignment =UITextAlignmentCenter;
[self addSubview:label];
_statusLabel=label;
[label release];
CALayer *layer = [CALayerlayer];
layer.frame =CGRectMake(25.0f,RefreshViewHight - RefreshViewHight,30.0f, 55.0f);
layer.contentsGravity =kCAGravityResizeAspect;
layer.contents = (id)[UIImageimageNamed:@"blueArrow.png"].CGImage;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000
if ([[UIScreenmainScreen] respondsToSelector:@selector(scale)]) {
layer.contentsScale = [[UIScreenmainScreen] scale];
}
#endif
[[selflayer] addSublayer:layer];
_arrowImage=layer;
UIActivityIndicatorView *view = [[UIActivityIndicatorViewalloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
view.frame = CGRectMake(25.0f, RefreshViewHight -38.0f, 20.0f, 20.0f);
[self addSubview:view];
_activityView = view;
[view release];
[selfsetState:EGOOPullRefreshNormal];
}
return self;
}
#pragma mark -
#pragma mark Setters
- (void)refreshLastUpdatedDate {
if ([_delegaterespondsToSelector:@selector(egoRefreshTableHeaderDataSourceLastUpdated:)]) {
NSDate *date = [_delegateegoRefreshTableHeaderDataSourceLastUpdated:self];
NSDateFormatter *formatter = [[NSDateFormatteralloc] init];
[formatter setAMSymbol:@"上午"];
[formatter setPMSymbol:@"下午"];
[formatter setDateFormat:@"yyyy/MM/dd hh:mm:a"];
_lastUpdatedLabel.text = [NSStringstringWithFormat:@"最後更新: %@", [formatterstringFromDate:date]];
[[NSUserDefaultsstandardUserDefaults] setObject:_lastUpdatedLabel.textforKey:@"EGORefreshTableView_LastRefresh"];
[[NSUserDefaultsstandardUserDefaults] synchronize];
[formatter release];
} else {
_lastUpdatedLabel.text =nil;
}
}
- (void)setState:(EGOPullRefreshState)aState{
switch (aState) {
caseEGOOPullRefreshPulling:
_statusLabel.text =NSLocalizedString(@"鬆開即可更新...",@"鬆開即可更新...");
[CATransactionbegin];
[CATransactionsetAnimationDuration:FLIP_ANIMATION_DURATION];
_arrowImage.transform =CATransform3DMakeRotation((M_PI /180.0) * 180.0f,0.0f, 0.0f,1.0f);
[CATransactioncommit];
break;
caseEGOOPullRefreshNormal:
if (_state ==EGOOPullRefreshPulling) {
[CATransactionbegin];
[CATransactionsetAnimationDuration:FLIP_ANIMATION_DURATION];
_arrowImage.transform =CATransform3DIdentity;
[CATransactioncommit];
}
_statusLabel.text =NSLocalizedString(@"上拉即可查看更多...",@"上拉即可查看更多...");
[_activityViewstopAnimating];
[CATransactionbegin];
[CATransactionsetValue:(id)kCFBooleanTrueforKey:kCATransactionDisableActions];
_arrowImage.hidden =NO;
_arrowImage.transform =CATransform3DIdentity;
[CATransactioncommit];
[selfrefreshLastUpdatedDate];
break;
caseEGOOPullRefreshLoading:
_statusLabel.text =NSLocalizedString(@"加載中...",@"加載中...");
[_activityViewstartAnimating];
[CATransactionbegin];
[CATransactionsetValue:(id)kCFBooleanTrueforKey:kCATransactionDisableActions];
_arrowImage.hidden =YES;
[CATransactioncommit];
break;
default:
break;
}
_state = aState;
}
#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(0.0,0.0f, RefreshViewHight,0.0f);
} else if (scrollView.isDragging) {
BOOL _loading = NO;
if ([_delegaterespondsToSelector:@selector(egoRefreshTableHeaderDataSourceIsLoading:)]) {
_loading = [_delegateegoRefreshTableHeaderDataSourceIsLoading:self];
}
if (_state ==EGOOPullRefreshPulling && scrollView.contentOffset.y + (scrollView.frame.size.height) < scrollView.contentSize.height + RefreshViewHight && scrollView.contentOffset.y >0.0f && !_loading) {
[selfsetState:EGOOPullRefreshNormal];
} else if (_state == EGOOPullRefreshNormal && scrollView.contentOffset.y + (scrollView.frame.size.height) > scrollView.contentSize.height +RefreshViewHight && !_loading) {
[selfsetState:EGOOPullRefreshPulling];
}
if (scrollView.contentInset.bottom !=0) {
scrollView.contentInset =UIEdgeInsetsZero;
}
}
}
//當用戶停止拖動,並且手指從屏幕中拿開的的時候調用此方法
- (void)egoRefreshScrollViewDidEndDragging:(UIScrollView *)scrollView {
BOOL _loading = NO;
if ([_delegaterespondsToSelector:@selector(egoRefreshTableHeaderDataSourceIsLoading:)]) {
_loading = [_delegateegoRefreshTableHeaderDataSourceIsLoading:self];
}
if (scrollView.contentOffset.y + (scrollView.frame.size.height) > scrollView.contentSize.height + RefreshViewHight && !_loading) {
if ([_delegaterespondsToSelector:@selector(egoRefreshTableHeaderDidTriggerRefresh:)]) {
[_delegateegoRefreshTableHeaderDidTriggerRefresh:self];
}
[selfsetState:EGOOPullRefreshLoading];
[UIViewbeginAnimations:nilcontext:NULL];
[UIViewsetAnimationDuration:0.2];
scrollView.contentInset =UIEdgeInsetsMake(0.0f,0.0f, RefreshViewHight,0.0f);
[UIViewcommitAnimations];
}
}
//當開發者頁面頁面刷新完畢調用此方法,[delegate egoRefreshScrollViewDataSourceDidFinishedLoading: scrollView];
- (void)egoRefreshScrollViewDataSourceDidFinishedLoading:(UIScrollView *)scrollView {
[UIView beginAnimations:nilcontext:NULL];
[UIView setAnimationDuration:.3];
[scrollView setContentInset:UIEdgeInsetsMake(0.0f,0.0f, 0.0f,0.0f)];
[UIView commitAnimations];
[selfsetState:EGOOPullRefreshNormal];
}
#pragma mark -
#pragma mark Dealloc
- (void)dealloc {
_delegate=nil;
_activityView =nil;
_statusLabel =nil;
_arrowImage =nil;
_lastUpdatedLabel =nil;
[super dealloc];
}
@end
主要實現的地方是:
1、在哪裏顯示這個上拉刷新的地方,添加下面這個
if (_refreshHeaderView == nil) {
EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderViewalloc] initWithFrame:CGRectMake(0.0f,0.0f, self.view.frame.size.width,70)];
view.delegate = self;
[self.tableViewaddSubview:view];
_refreshHeaderView = view;
[view release];
}
2、加載數據、加載數據結束後:
- (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
//結束加載數據
}
(如果是對TableView實現功能的話,注意要reloadData)。