iphone實現上拉刷新的方法(Andy)

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)。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章