// // EGORefreshTableHeaderView.h // Demo // // Created by Devin Doty on 10/14/09October14. // Copyright 2009 enormego. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // #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; //扩展:下拉显示加载 - (void)initLoading:(UIScrollView *)scrollView; @end @protocol EGORefreshTableHeaderDelegate - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view; - (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view; @optional - (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view; @end
// // EGORefreshTableHeaderView.m // Demo // // Created by Devin Doty on 10/14/09October14. // Copyright 2009 enormego. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // #import "EGORefreshTableHeaderView.h" #import "iPhoneVersion.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:13.0f]; label.textColor = TEXT_COLOR; label.textColor = RGBColorMake(183,154,123,1); //label.shadowColor = [UIColor colorWithWhite:0.9f alpha:1.0f]; //label.shadowOffset = CGSizeMake(0.0f, 1.0f); label.backgroundColor = [UIColor clearColor]; label.textAlignment = UITextAlignmentCenter; [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 boldSystemFontOfSize:13.0f]; label.textColor = RGBColorMake(183,154,123,1); label.backgroundColor = [UIColor clearColor]; label.textAlignment = UITextAlignmentCenter; [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:@"blueArrow.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 - 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:@"MM/dd/yyyy HH:mm"]; _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]; } //扩展:下拉显示加载 - (void)initLoading:(UIScrollView *)scrollView { // [UIView beginAnimations:nil context:nil]; // [UIView setAnimationDuration:0.3]; scrollView.contentInset = UIEdgeInsetsMake(60.0f, 0.0f, 0.0f, 0.0f); scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x, -60); [self setState:EGOOPullRefreshLoading]; // [UIView commitAnimations]; } #pragma mark - #pragma mark Dealloc - (void)dealloc { _delegate = nil; _activityView = nil; _statusLabel = nil; _arrowImage = nil; _lastUpdatedLabel = nil; [super dealloc]; } @end