tableView下拉刷新与加载更多
来源:互联网 发布:java工程师的直接上级 编辑:程序博客网 时间:2024/05/20 04:13
在使用tablevie的应用中基本上都会使用下拉刷新和加载更多,所以掌握这两个效果的实现是很有必要的,在ios6中添加了UIrefreshControl为表视图控制器增加了下拉刷新功能,而之前的版本就只能使用第三方的了,EGO团队的开源代码就不错 ,可以使用一下代码初始化
if(NSClassFromString(@"UIRefreshControl")) {
self.refreshControl = [[UIRefreshControl alloc] init];
[self.refreshControl addTarget:self action:@selector(refreshedByPullingTable:) forControlEvents:UIControlEventValueChanged];
} else {
self.refreshHeaderView = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - self.tableView.bounds.size.height, self.tableView.bounds.size.width, self.tableView.bounds.size.height)];
self.refreshHeaderView.keyNameForDataStore = [NSString stringWithFormat:@"%@_LastRefresh", [self class]];
self.tableView.showsVerticalScrollIndicator = YES;
[self.tableView addSubview:self.refreshHeaderView];
}
当下拉到临界点时controller会处理UIScrollView 的委托,在UITableView视图顶部增加一个EGORefreshHeaderView视图,记住最后的状态保存到某个键中 实现代码如下
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
if(self.searchDisplayController.searchResultsTableView == scrollView) return;
if (self.refreshHeaderView.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) {
if (self.refreshHeaderView.state == EGOOPullRefreshPulling && scrollView.contentOffset.y > -65.0f && scrollView.contentOffset.y < 0.0f && !self.loading) {
[self.refreshHeaderView setState:EGOOPullRefreshNormal];
}
else if (self.refreshHeaderView.state == EGOOPullRefreshNormal && scrollView.contentOffset.y < -65.0f && !self.loading) {
[self.refreshHeaderView setState:EGOOPullRefreshPulling];
}
if (scrollView.contentInset.top != 0) {
scrollView.contentInset = UIEdgeInsetsZero;
}
}
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if(self.searchDisplayController.searchResultsTableView == scrollView) return;
if (scrollView.contentOffset.y <= - 65.0f && !self.loading) {
self.loading = YES;
[self.refreshHeaderView setState:EGOOPullRefreshLoading];
[self.tableView reloadData];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.2];
self.tableView.contentInset = UIEdgeInsetsMake(60.0f, 0.0f, 0.0f, 0.0f);
[UIView commitAnimations];
[self doRefresh];
}
}
-(void) refreshedByPullingTable:(id) sender {
[self.refreshControl beginRefreshing];
[self doRefresh];
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self.refreshControl endRefreshing];
});
}
-(void) doRefresh
{
NSLog(@"Override doRefresh in subclass. This line should not appear on console");
}
-(void) loadMore {
NSLog(@"Override loadMore in subclass. This line should not appear on console");
}
-(void) setLoading:(BOOL)loading
{
_loading = loading;
[UIView beginAnimations:nil context:NULL];
if(loading)
{
[self.refreshHeaderView setState:EGOOPullRefreshLoading];
[UIView setAnimationDuration:0.2];
self.tableView.contentInset = UIEdgeInsetsMake(60.0f, 0.0f, 0.0f, 0.0f);
}
else
{
[self.refreshHeaderView setState:EGOOPullRefreshNormal];
[self.refreshHeaderView setCurrentDate];
[UIView setAnimationDuration:.3];
[self.tableView setContentInset:UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, 0.0f)];
}
[UIView commitAnimations];
}
其中dorefesh和loadMore需要在子类中实现
加载更多 在loadMore中实现 当用户到达表视图当前页面时的底部时调用
-(void) loadMore {
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
self.pageCount ++;
if(self.pageCount == 5) self.endReached = YES;
[self.tableView reloadData];
});
}
每次加载20条数据 在子类中实现下拉刷新与加载更多 在父类中实现表视图更新 应该还有更好的解决方案
- tableView下拉刷新与加载更多
- 下拉刷新与加载更多
- 微信小程序-下拉刷新与加载更多
- 下拉刷新--加载更多
- SwipeRefreshLayout下拉刷新与上拉加载更多,分页加载
- Android 下拉刷新加载更多
- ListView 下拉刷新 加载更多
- RefreshRecyclerView下拉刷新,加载更多
- 下拉刷新和加载更多
- View下拉刷新加载更多
- IOS网络请求封装与下拉刷新上托加载更多
- Android各种View的下拉刷新与加载更多
- Android ListView下拉与上拉刷新加载更多(一)
- 关于List的下拉刷新与加载更多的组合
- 使用SwipeRefreshLayout实现下拉刷新与上拉加载更多
- android自定义ListView加载更多与下拉刷新集成
- 利用ViewDragHelper实现上拉加载更多与下拉刷新
- RecyclerView的下拉刷新数据 与上拉加载更多
- Update 语句 UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'
- CC2530与zigbee学习笔记の初识zigbee(1)
- paip.gui控件tabs控件加载内容的原理以及easyui最佳实现
- 图片管理Android工具类
- C++中的强制类型转换 static_cast reinterpret_cast dynamic_cast const_cast
- tableView下拉刷新与加载更多
- WPF知识点
- statement 与 Prestatement
- linux下IPTABLES配置详解
- 一篇不错的讲解Java异常的文章
- SAS DM数据准备读书笔记1(分解字符串)
- 理解JavaScript中的事件处理
- C语言编写程序的优点和缺点以及与C++的区别
- 22web app实现左右滑动控制菜单