今天和别人谈我的应用的时候,提到:我的项目中很多页面中上拉刷新的效果都不一样。让我特尴尬。
虽然有那么点产品经理的关系影响,但确实有自己很大的原因。既然是自己实现的,细节上太不注意了,所幸直接调整一下。
之前看过一些产品的上拉刷新效果,如微博,美团,淘粉吧中的效果,都很不错。之前一直用EGORefreshTable,但是看上去不是那么好看,接着又看了LoadMoreTableFooterView,可惜这个还差点,不能向美团中的一样,首先显示给用户知道“上拉显示更多”,不论点击和上拉都可以更新。所以就在LoadMoreTableFooterView上改改得了,呵呵。
代码如下:
// LoadMoreTableFooterView.h
#import <UIKit/UIKit.h>
typedef enum{
LoadMorePulling = 0,
LoadMoreNormal,
LoadMoreLoading,
} LoadMoreState;
@protocol LoadMoreTableFooterDelegate;
@interface LoadMoreTableFooterView : UIView
{
id _delegate;
}
@property(nonatomic,assign) id<LoadMoreTableFooterDelegate> delegate;
@property(nonatomic,retain) UIButton *statusButton;
@property(nonatomic,retain) UIActivityIndicatorView *activityView;
@property(nonatomic,assign) LoadMoreState state;
- (void)loadMoreScrollViewDidScroll:(UIScrollView *)scrollView;
- (void)loadMoreScrollViewDidEndDragging:(UIScrollView *)scrollView;
- (void)loadMoreScrollViewDataSourceDidFinishedLoading:(UIScrollView *)scrollView;
- (void)showMore;
@end
@protocol LoadMoreTableFooterDelegate
- (void)loadMoreTableFooterDidTriggerRefresh:(LoadMoreTableFooterView *)view;
- (BOOL)loadMoreTableFooterDataSourceIsLoading:(LoadMoreTableFooterView *)view;
@end
// LoadMoreTableFooterView.h
#import "LoadMoreTableFooterView.h"
@interface LoadMoreTableFooterView (Private)
- (void)setState:(LoadMoreState)aState;
@end
@implementation LoadMoreTableFooterView
@synthesize delegate = _delegate;
@synthesize statusButton = _statusButton;
@synthesize activityView = _activityView;
@synthesize state = _state;
#pragma mark -
#pragma mark Dealloc
- (void)dealloc {
_delegate=nil;
[_statusButton release];
[_activityView release];
[super dealloc];
}
- (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];
self.backgroundColor = [UIColor whiteColor];
_statusButton = [[UIButton alloc] initWithFrame:CGRectMake(0.0f, 10.0f, self.frame.size.width, 20.0f)];
//UIButton *showbtn =[UIButton buttonWithType:UIButtonTypeRoundedRect];
[_statusButton addTarget:self action:@selector(showMore) forControlEvents:UIControlEventTouchUpInside];
[_statusButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
_statusButton.titleLabel.font = [UIFont systemFontOfSize: 15.0];
[self addSubview:_statusButton];
_activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
_activityView.frame = CGRectMake(50.0f, 10.0f, 20.0f, 20.0f);
[self addSubview:_activityView];
[self setState:LoadMoreNormal];
}
return self;
}
#pragma mark -
#pragma mark Setters
- (void)setState:(LoadMoreState)aState{
switch (aState) {
case LoadMorePulling:
[_statusButton setTitle:NSLocalizedString(@"松开加载更多", @"松开加载更多") forState:UIControlStateNormal];
break;
case LoadMoreNormal:
[_statusButton setTitle:NSLocalizedString(@"上拉加载更多", @"上拉加载更多") forState:UIControlStateNormal];
[_activityView stopAnimating];
break;
case LoadMoreLoading:
[_statusButton setTitle:NSLocalizedString(@"加载中...", @"加载中") forState:UIControlStateNormal];
[_activityView startAnimating];
break;
default:
break;
}
_state = aState;
}
#pragma mark -
#pragma mark ScrollView Methods
- (void)loadMoreScrollViewDidScroll:(UIScrollView *)scrollView {
if (_state == LoadMoreLoading) {
scrollView.contentInset = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, 0.0f);
} else if (scrollView.isDragging) {
BOOL _loading = NO;
if ([_delegate respondsToSelector:@selector(loadMoreTableFooterDataSourceIsLoading:)]) {
_loading = [_delegate loadMoreTableFooterDataSourceIsLoading:self];
}
if (_state == LoadMoreNormal && scrollView.contentOffset.y > (scrollView.contentSize.height - (scrollView.frame.size.height-30)) && !_loading) {
[self setState:LoadMorePulling];
} else if (_state == LoadMorePulling && scrollView.contentOffset.y < (scrollView.contentSize.height - (scrollView.frame.size.height-30)) && !_loading) {
[self setState:LoadMoreNormal];
}
if (scrollView.contentInset.bottom != 0) {
scrollView.contentInset = UIEdgeInsetsZero;
}
}
}
- (void)loadMoreScrollViewDidEndDragging:(UIScrollView *)scrollView {
BOOL _loading = NO;
if ([_delegate respondsToSelector:@selector(loadMoreTableFooterDataSourceIsLoading:)]) {
_loading = [_delegate loadMoreTableFooterDataSourceIsLoading:self];
}
if (scrollView.contentOffset.y > (scrollView.contentSize.height - (scrollView.frame.size.height-30)) && !_loading) {
[self setState:LoadMoreLoading];
if ([_delegate respondsToSelector:@selector(loadMoreTableFooterDidTriggerRefresh:)]) {
[_delegate loadMoreTableFooterDidTriggerRefresh:self];
}
}
}
- (void)loadMoreScrollViewDataSourceDidFinishedLoading:(UIScrollView *)scrollView {
[self setState:LoadMoreNormal];
}
- (void)showMore{
BOOL _loading = NO;
if ([_delegate respondsToSelector:@selector(loadMoreTableFooterDataSourceIsLoading:)]) {
_loading = [_delegate loadMoreTableFooterDataSourceIsLoading:self];
}
if (YES == _loading) return;
[self setState:LoadMoreLoading];
if ([_delegate respondsToSelector:@selector(loadMoreTableFooterDidTriggerRefresh:)]) {
[_delegate loadMoreTableFooterDidTriggerRefresh:self];
}
}
@end
使用时:
if (_loadMoreFooterView == nil) {
LoadMoreTableFooterView *view = [[LoadMoreTableFooterView alloc] initWithFrame:CGRectMake(0.0f, 0, self.resultTable.frame.size.width, 40)];
view.delegate = self;
_resultTable.tableFooterView = view;
self.loadMoreFooterView = view;
[view release];
}
//此方法是开始读取数据
- (void)reloadTableViewDataSource{
if (_reloading) return;
//should be calling your tableviews data source model to reload
_reloading = YES;
NSLog(@"star");
if (NO == [_dataSource searchNextPageByKey:_keyWord searchType:_searchType]) {
[self doneLoadingTableViewData];
}
}
//此方法是结束读取数据
- (void)doneLoadingTableViewData{
// model should call this when its done loading
_reloading = NO;
[_loadMoreFooterView loadMoreScrollViewDataSourceDidFinishedLoading:self.resultTable];
NSLog(@"end");
}
// 监听tableview的滑动事件
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
if (_reloading) return;
[_loadMoreFooterView loadMoreScrollViewDidScroll:scrollView];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
if (!_reloading) {
[_loadMoreFooterView loadMoreScrollViewDidEndDragging:scrollView];
}
if (!decelerate)
{
}
}
#pragma mark -
#pragma mark LoadMoreTableFooterDelegate Methods
- (void)loadMoreTableFooterDidTriggerRefresh:(LoadMoreTableFooterView *)view {
[self reloadTableViewDataSource];
//[self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:3.0];
}
- (BOOL)loadMoreTableFooterDataSourceIsLoading:(LoadMoreTableFooterView *)view {
return _reloading;
}
最后的效果还是不错的,呵呵