EGOTableViewPullRefresh是一个在ios下实现表格下拉刷新和上拉刷新的功能组件。
在ios6下,使用的非常好,iso到7后,在计算视图大小时候考虑 UIRectEage,于是乎这个pulltableview就有点问题,具体表现在头部会升上去,被状态栏和导航栏遮住,因为在ios6下坐标0就是在导航栏下面,但是在ios7除非self.edgesForExtendedLayout = UIRectEdgeNone;
否则坐标0就是从屏幕最上面开始算的。
有2种解决办法:
1.在ios7和8下面,指定UIViewController不计算边角,加以下代码就可:
self.edgesForExtendedLayout = UIRectEdgeNone;
2.修改EGORefreshTableHeaderView。
思路就是保存一个初始化默认高度defaultHeight,第一次调用的时候取出来保存一下,这个值在ios6和设置UIRectEdgeNone情况下是0,否则是64,然后下啦的时候,以前是直接加PULL_AREA_HEIGHT,现在还需要加个defaultHeight,同理减去也是这个值,判断坐标时也要考虑这个值,然后就能完美适应ios6、7、8情况了。
代码:
// // 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" @interface EGORefreshTableHeaderView (Private) - (void)setState:(EGOPullState)aState; @end @implementation EGORefreshTableHeaderView @synthesize delegate=_delegate; - (id)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { isLoading = NO; CGFloat midY = frame.size.height - PULL_AREA_HEIGTH/2; /* Config Last Updated Label */ UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, midY, self.frame.size.width, 20.0f)]; label.autoresizingMask = UIViewAutoresizingFlexibleWidth; label.font = [UIFont systemFontOfSize:12.0f]; label.shadowOffset = CGSizeMake(0.0f, 1.0f); label.backgroundColor = [UIColor clearColor]; label.textAlignment = UITextAlignmentCenter; [self addSubview:label]; _lastUpdatedLabel=label; /* Config Status Updated Label */ label = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, midY - 18, self.frame.size.width, 20.0f)]; label.autoresizingMask = UIViewAutoresizingFlexibleWidth; label.font = [UIFont boldSystemFontOfSize:13.0f]; label.shadowOffset = CGSizeMake(0.0f, 1.0f); label.backgroundColor = [UIColor clearColor]; label.textAlignment = UITextAlignmentCenter; [self addSubview:label]; _statusLabel=label; /* Config Arrow Image */ CALayer *layer = [[CALayer alloc] init]; layer.frame = CGRectMake(25.0f,midY - 35, 30.0f, 55.0f); layer.contentsGravity = kCAGravityResizeAspect; #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; /* Config activity indicator */ UIActivityIndicatorView *view = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:DEFAULT_ACTIVITY_INDICATOR_STYLE]; view.frame = CGRectMake(25.0f,midY - 8, 20.0f, 20.0f); [self addSubview:view]; _activityView = view; [self setState:EGOOPullNormal]; /* Configure the default colors and arrow image */ [self setBackgroundColor:nil textColor:nil arrowImage:nil]; scrollViewDefaultTop = -1; } return self; } #pragma mark - #pragma mark Setters #define aMinute 60 #define anHour 3600 #define aDay 86400 - (void)refreshLastUpdatedDate { NSDate * date = nil; if ([_delegate respondsToSelector:@selector(egoRefreshTableHeaderDataSourceLastUpdated:)]) { date = [_delegate egoRefreshTableHeaderDataSourceLastUpdated:self]; } if(date) { NSTimeInterval timeSinceLastUpdate = [date timeIntervalSinceNow]; NSInteger timeToDisplay = 0; timeSinceLastUpdate *= -1; if(timeSinceLastUpdate < anHour) { timeToDisplay = (NSInteger) (timeSinceLastUpdate / aMinute); if(timeToDisplay == /* Singular*/ 1) { _lastUpdatedLabel.text = [NSString stringWithFormat:NSLocalizedStringFromTable(@"Updated %ld minute ago",@"PullTableViewLan",@"Last uppdate in minutes singular"),(long)timeToDisplay]; } else { /* Plural */ _lastUpdatedLabel.text = [NSString stringWithFormat:NSLocalizedStringFromTable(@"Updated %ld minutes ago",@"PullTableViewLan",@"Last uppdate in minutes plural"), (long)timeToDisplay]; } } else if (timeSinceLastUpdate < aDay) { timeToDisplay = (NSInteger) (timeSinceLastUpdate / anHour); if(timeToDisplay == /* Singular*/ 1) { _lastUpdatedLabel.text = [NSString stringWithFormat:NSLocalizedStringFromTable(@"Updated %ld hour ago",@"PullTableViewLan",@"Last uppdate in hours singular"), (long)timeToDisplay]; } else { /* Plural */ _lastUpdatedLabel.text = [NSString stringWithFormat:NSLocalizedStringFromTable(@"Updated %ld hours ago",@"PullTableViewLan",@"Last uppdate in hours plural"), (long)timeToDisplay]; } } else { timeToDisplay = (NSInteger) (timeSinceLastUpdate / aDay); if(timeToDisplay == /* Singular*/ 1) { _lastUpdatedLabel.text = [NSString stringWithFormat:NSLocalizedStringFromTable(@"Updated %ld day ago",@"PullTableViewLan",@"Last uppdate in days singular"), (long)timeToDisplay]; } else { /* Plural */ _lastUpdatedLabel.text = [NSString stringWithFormat:NSLocalizedStringFromTable(@"Updated %ld days ago",@"PullTableViewLan",@"Last uppdate in days plural"), (long)timeToDisplay]; } } } else { _lastUpdatedLabel.text = nil; } // Center the status label if the lastupdate is not available CGFloat midY = self.frame.size.height - PULL_AREA_HEIGTH/2; if(!_lastUpdatedLabel.text) { _statusLabel.frame = CGRectMake(0.0f, midY - 8, self.frame.size.width, 20.0f); } else { _statusLabel.frame = CGRectMake(0.0f, midY - 18, self.frame.size.width, 20.0f); } } - (void)setState:(EGOPullState)aState{ switch (aState) { case EGOOPullPulling: _statusLabel.text = NSLocalizedStringFromTable(@"Release to refresh...",@"PullTableViewLan", @"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 EGOOPullNormal: if (_state == EGOOPullPulling) { [CATransaction begin]; [CATransaction setAnimationDuration:FLIP_ANIMATION_DURATION]; _arrowImage.transform = CATransform3DIdentity; [CATransaction commit]; } _statusLabel.text = NSLocalizedStringFromTable(@"Pull down to refresh...",@"PullTableViewLan", @"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 EGOOPullLoading: _statusLabel.text = NSLocalizedStringFromTable(@"Loading...",@"PullTableViewLan", @"Loading Status"); [_activityView startAnimating]; [CATransaction begin]; [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; _arrowImage.hidden = YES; [CATransaction commit]; break; default: break; } _state = aState; } - (void)setBackgroundColor:(UIColor *)backgroundColor textColor:(UIColor *) textColor arrowImage:(UIImage *) arrowImage { self.backgroundColor = backgroundColor? backgroundColor : DEFAULT_BACKGROUND_COLOR; if(textColor) { _lastUpdatedLabel.textColor = textColor; _statusLabel.textColor = textColor; } else { _lastUpdatedLabel.textColor = DEFAULT_TEXT_COLOR; _statusLabel.textColor = DEFAULT_TEXT_COLOR; } _lastUpdatedLabel.shadowColor = [_lastUpdatedLabel.textColor colorWithAlphaComponent:0.1f]; _statusLabel.shadowColor = [_statusLabel.textColor colorWithAlphaComponent:0.1f]; _arrowImage.contents = (id)(arrowImage? arrowImage.CGImage : DEFAULT_ARROW_IMAGE.CGImage); } #pragma mark - #pragma mark ScrollView Methods - (void)egoRefreshScrollViewDidScroll:(UIScrollView *)scrollView { if (_state == EGOOPullLoading) { CGFloat offset = MAX(scrollView.contentOffset.y * -1, 0); offset = MIN(offset, PULL_AREA_HEIGTH); UIEdgeInsets currentInsets = scrollView.contentInset; if(offset > currentInsets.top)//xf currentInsets.top = offset; scrollView.contentInset = currentInsets; } else if (scrollView.isDragging) { NSLog(@"%f",scrollView.contentOffset.y); if (_state == EGOOPullPulling && scrollView.contentOffset.y > -(PULL_TRIGGER_HEIGHT+scrollViewDefaultTop) && scrollView.contentOffset.y < 0.0f && !isLoading) { [self setState:EGOOPullNormal]; } else if (_state == EGOOPullNormal && scrollView.contentOffset.y < -(PULL_TRIGGER_HEIGHT+scrollViewDefaultTop) && !isLoading) { [self setState:EGOOPullPulling]; } if (scrollView.contentInset.top != scrollViewDefaultTop) {//xf !=0 UIEdgeInsets currentInsets = scrollView.contentInset; currentInsets.top -= PULL_AREA_HEIGTH;//xf scrollView.contentInset = currentInsets; } } } - (void)startAnimatingWithScrollView:(UIScrollView *) scrollView { isLoading = YES; [self setState:EGOOPullLoading]; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.2]; UIEdgeInsets currentInsets = scrollView.contentInset; if(scrollViewDefaultTop == -1){//xf scrollViewDefaultTop = currentInsets.top; } currentInsets.top += PULL_AREA_HEIGTH;//xf scrollView.contentInset = currentInsets; [UIView commitAnimations]; if(scrollView.contentOffset.y == 0){ [scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x, -PULL_TRIGGER_HEIGHT) animated:YES]; } } - (void)egoRefreshScrollViewDidEndDragging:(UIScrollView *)scrollView { if (scrollView.contentOffset.y <= - (PULL_TRIGGER_HEIGHT+scrollViewDefaultTop) && !isLoading) { if ([_delegate respondsToSelector:@selector(egoRefreshTableHeaderDidTriggerRefresh:)]) { [_delegate egoRefreshTableHeaderDidTriggerRefresh:self]; } [self startAnimatingWithScrollView:scrollView]; } } - (void)egoRefreshScrollViewDataSourceDidFinishedLoading:(UIScrollView *)scrollView { isLoading = NO; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:.2]; UIEdgeInsets currentInsets = scrollView.contentInset; currentInsets.top -= PULL_AREA_HEIGTH;//xf scrollView.contentInset = currentInsets; [UIView commitAnimations]; [self setState:EGOOPullNormal]; } - (void)egoRefreshScrollViewWillBeginDragging:(UIScrollView *)scrollView { [self refreshLastUpdatedDate]; } #pragma mark - #pragma mark Dealloc - (void)dealloc { _delegate=nil; [_activityView release]; [_statusLabel release]; [_arrowImage release]; [_lastUpdatedLabel release]; [super dealloc]; } @end
相关推荐
1.实现了简单的分组tableView,显示的是省份-城市关联信息,测试数据使用plist属性文件保存。 另外实现了类似iPhone...另外会显示进度指示动画和上次更新时间,具体实现试用了开源的EGOTableViewPullRefresh控件。
EGOTableViewPullRefresh 是一个基于iOS平台的开源项目,它为UITableView提供了下拉刷新功能。在iOS应用开发中,为了实现动态加载数据,通常会使用下拉刷新这一交互设计,以便用户可以获取到最新的信息。...
`UITableView`的下拉刷新功能通常通过第三方库来实现,其中`EGOTableViewPullRefresh`是一个广泛使用的开源库。下面将详细讲解如何使用`EGOTableViewPullRefresh`库来为`UITableView`添加下拉刷新功能。 首先,`...
首先,让我们深入了解EGOTableViewPullRefresh的下拉刷新功能。这个特性允许用户通过向下拉动表格视图来触发数据的更新,通常用于加载更多数据或刷新已有数据。EGOTableViewPullRefresh将这个交互模式集成到了...
6. **与Auto Layout兼容** 考虑到现代iOS开发中Auto Layout的广泛使用,EGOTableViewPullRefresh也支持在Auto Layout环境下工作。开发者需要确保正确配置约束,使得刷新视图能够正确显示和隐藏。 总结,...
《下拉刷新EGOTableViewPullRefresh:iOS中的刷新机制实现》 在iOS应用开发中,为用户提供流畅且直观的交互体验至关重要。下拉刷新(Pull-to-Refresh)和上拉加载更多(Infinite Scrolling)功能是现代移动应用中...
EGOTableViewPullRefresh个人理解代码原理和使用
EGOTableViewPullRefresh是一款在iOS开发中常用的库,专门用于实现UITableView的下拉刷新和上拉加载更多功能。这个库由Ego Systems开发,旨在提供一个简单易用的解决方案,帮助开发者快速集成这两种常见的滚动交互。...
当用户松手后,它会触发一个委托方法,即`- (void)egoRefreshTableHeaderDidTriggerRefresh:`,让应用可以开始执行实际的刷新操作。在刷新完成后,开发者需要调用`[refreshHeaderView egoRefreshCompleted];`来更新...
这种交互设计极大地提升了用户体验,让用户可以方便地获取到最新的数据。本教程将详细介绍如何在iOS应用中集成上下拉刷新。 一、iOS上下拉刷新原理 上下拉刷新的基本原理是监听用户的触摸手势,当用户在滚动视图到...
7. **兼容性**:EGOTableViewPullRefresh库适用于Objective-C编写的应用,如果你的项目是Swift,可以通过桥接头文件来使用。对于Swift开发者,还可以考虑使用Swift版本的下拉刷新库,如SDRefreshControl或...
EGOTableViewPullRefresh *pullRefresh = [[EGOTableViewPullRefresh alloc] initWithScrollView:self.tableView delegate:self]; self.tableView.headerView = pullRefresh; ``` 4. **实现协议方法**:你需要...
本教程将介绍如何使用EGOTableViewPullRefresh开源库在iOS应用中实现下拉刷新功能,并针对原代码进行一些自定义以支持中英文显示和调整刷新时间格式。 首先,EGOTableViewPullRefresh是由Egor Gorin开发的一个轻量...
接下来,我们将深入探讨如何实现下拉刷新`UITableView`的功能,并结合提供的`EGOTableViewPullRefresh`库进行详细讲解。 首先,我们需要了解`UITableView`的基本操作。`UITableView`是基于`UIScrollView`的,因此它...
本篇文章将深入探讨如何实现这个功能,我们将基于`EGOTableViewPullRefresh`库进行讲解。 `EGOTableViewPullRefresh`是一个开源的iOS组件,它提供了一个简单的方法来添加下拉刷新功能到UITableView。这个库是由Eric...
EGOTableViewPullRefresh的核心是EGOPullRefreshTableHeaderView,这是一个自定义的表视图头部视图,当用户在顶部向下滑动时显示,并提供一个动画效果,表明可以执行刷新操作。它通过监听UITableView的滚动事件来...
这个压缩包文件“IOS源码——IOS网易新闻下拉刷新demo_10802.7z”包含了一个名为“EGOTableViewPullRefresh-master”的项目,这是一个针对iOS平台的开源库,专门用于实现新闻应用中常见的下拉刷新功能。这个功能在...
- 加载完毕后,通过调用`[tableView reloadData]`刷新表格视图,并通过委托方法通知EGOTableViewPullRefresh刷新或加载已经完成,以便隐藏刷新视图。 4. 动画效果: - EGOTableViewPullRefresh库提供了一些预设...