EGORefreshTableHeaderView

EGORefreshTableHeaderView.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





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)aState;

@end


@implementation EGORefreshTableHeaderView


@synthesize delegate=_delegate;



- (id)initWithFrame:(CGRect)frame {

    if (self = [super initWithFrame:frame]) {

self.autoresizingMask = UIViewAutoresizingFlexibleWidth;

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 = UIViewAutoresizingFlexibleWidth;

label.font = [UIFont systemFontOfSize:12.0f];

label.textColor = TEXT_COLOR;

label.shadowColor = [UIColor colorWithWhite:0.9f alpha:1.0f];

label.shadowOffset = CGSizeMake(0.0f, 1.0f);

label.backgroundColor = [UIColor clearColor];

label.textAlignment = NSTextAlignmentCenter;

[self addSubview:label];

_lastUpdatedLabel=label;

[label release];

label = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, frame.size.height - 48.0f, self.frame.size.width, 20.0f)];

label.autoresizingMask = UIViewAutoresizingFlexibleWidth;

label.font = [UIFont fontWithName:FontType size:13.0f];

label.textColor = TEXT_COLOR;

label.shadowColor = [UIColor colorWithWhite:0.9f alpha:1.0f];

label.shadowOffset = CGSizeMake(0.0f, 1.0f);

label.backgroundColor = [UIColor clearColor];

label.textAlignment = NSTextAlignmentCenter;

[self addSubview:label];

_statusLabel=label;

[label release];

CALayer *layer = [CALayer layer];

layer.frame = CGRectMake(25.0f, frame.size.height - 65.0f, 30.0f, 55.0f);

layer.contentsGravity = kCAGravityResizeAspect;

layer.contents = (id)[UIImage imageNamed:@"grayArrow.png"].CGImage;

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {

layer.contentsScale = [[UIScreen mainScreen] scale];

}

#endif

[[self layer] addSublayer:layer];

_arrowImage=layer;

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;

[view release];

[self setState:EGOOPullRefreshNormal];

    }

    return self;

}



#pragma mark -

#pragma mark Setters


- (void)refreshLastUpdatedDate {

if ([_delegate respondsToSelector:@selector(egoRefreshTableHeaderDataSourceLastUpdated:)]) {

NSDate *date = [_delegate egoRefreshTableHeaderDataSourceLastUpdated:self];

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

[formatter setAMSymbol:@"AM"];

[formatter setPMSymbol:@"PM"];

[formatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];

_lastUpdatedLabel.text = [NSString stringWithFormat:@"最近更新:%@", [formatter stringFromDate:date]];

[[NSUserDefaults standardUserDefaults] setObject:_lastUpdatedLabel.text forKey:@"EGORefreshTableView_LastRefresh"];

[[NSUserDefaults standardUserDefaults] synchronize];

[formatter release];

} else {

_lastUpdatedLabel.text = nil;

}

}


- (void)setState:(EGOPullRefreshState)aState{

switch (aState) {

case EGOOPullRefreshPulling:

_statusLabel.text = NSLocalizedString(@"释放立即刷新", @"Release to refresh status");

[CATransaction begin];

[CATransaction setAnimationDuration:FLIP_ANIMATION_DURATION];

_arrowImage.transform = CATransform3DMakeRotation((M_PI / 180.0) * 180.0f, 0.0f, 0.0f, 1.0f);

[CATransaction commit];

break;

case EGOOPullRefreshNormal:

if (_state == EGOOPullRefreshPulling) {

[CATransaction begin];

[CATransaction setAnimationDuration:FLIP_ANIMATION_DURATION];

_arrowImage.transform = CATransform3DIdentity;

[CATransaction commit];

}

_statusLabel.text = NSLocalizedString(@"下拉刷新", @"Pull down to refresh status");

[_activityView stopAnimating];

[CATransaction begin];

[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; 

_arrowImage.hidden = NO;

_arrowImage.transform = CATransform3DIdentity;

[CATransaction commit];

[self refreshLastUpdatedDate];

break;

case EGOOPullRefreshLoading:

_statusLabel.text = NSLocalizedString(@"正在刷新", @"Loading Status");

[_activityView startAnimating];

[CATransaction begin];

[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; 

_arrowImage.hidden = YES;

[CATransaction commit];

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(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];

}

if (scrollView.contentInset.top != 0) {

scrollView.contentInset = UIEdgeInsetsZero;

}

}

}


- (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 setContentInset:UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, 0.0f)];

[UIView commitAnimations];

[self setState:EGOOPullRefreshNormal];


}



#pragma mark -

#pragma mark Dealloc


- (void)dealloc {

_delegate=nil;

_activityView = nil;

_statusLabel = nil;

_arrowImage = nil;

_lastUpdatedLabel = nil;

    [super dealloc];

}



@end




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值