上拉刷新功能

本文详细介绍了如何优化自定义上拉加载更多功能,通过调整代码使其在不同状态下显示不同的提示信息,提升用户体验。实现了从初始状态到加载状态、刷新状态的平滑过渡,并且提供了数据加载完成后的反馈机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天和别人谈我的应用的时候,提到:我的项目中很多页面中上拉刷新的效果都不一样。让我特尴尬。

虽然有那么点产品经理的关系影响,但确实有自己很大的原因。既然是自己实现的,细节上太不注意了,所幸直接调整一下。

之前看过一些产品的上拉刷新效果,如微博,美团,淘粉吧中的效果,都很不错。之前一直用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;
}

最后的效果还是不错的,呵呵



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值