| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- //
- // 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 "EGORefreshTableHeaderViews.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 EGORefreshTableHeaderViews (Private)
- - (void)setState:(EGOPullRefreshState)aState;
- @end
- @implementation EGORefreshTableHeaderViews
- @synthesize delegate=_delegate;
- @synthesize isMessageVC = _isMessageVC;
- - (id)initWithFrame:(CGRect)frame {
- if (self = [super initWithFrame:frame]) {
- _isMessageVC = NO;
- 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;// 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 = 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:@"tableview_pulltorefresh_arrow.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];
- /*_activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
- _activityView.frame = CGRectMake(25.0f, frame.size.height - 38.0f, 20.0f, 20.0f);*/
- [self addSubview:_activityView];
-
-
- [self setState:EGOOPullRefreshNormal];
- }
-
- return self;
-
- }
- #pragma mark -
- #pragma mark Setters
- - (void)refreshLastUpdatedDate {
-
- if ([_delegate respondsToSelector:@selector(egoRefreshTableHeaderDataSourceLastUpdated:)]) {
- // if(1==1){
- 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:
-
- if (_isMessageVC == YES) {
-
- _statusLabel.text = NSLocalizedString(@"松开即可加载...", @"Release to refresh status");
- }else{
-
- _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];
- }
-
- if (_isMessageVC == YES) {
-
- _statusLabel.text = NSLocalizedString(@"下拉获取历史...", @"Pull down to refresh status");
- }else{
-
- _statusLabel.text = NSLocalizedString(@"下拉可以刷新...", @"Pull down to refresh status");
- }
- //_activityView.backgroundColor=[UIColor redColor];
- [_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:)]) {
- // if(1==1){
- _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:)]) {
- // if(1==1){
- _loading = [_delegate egoRefreshTableHeaderDataSourceIsLoading:self];
- }
-
- if (scrollView.contentOffset.y <= - 65.0f && !_loading) {
-
- if ([_delegate respondsToSelector:@selector(egoRefreshTableHeaderDidTriggerRefresh:)]) {
- // if(1==1){
- [_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
|