自定义刷新tableView
//
// LSTWholeTableController.m
// BUDEJIE
//
// Created by admin on 16/8/17.
// Copyright © 2016年 ibokan. All rights reserved.
//
#import "LSTWholeTableController.h"
#import "AFNetworking.h"
#import "LSTWholeModal.h"
#import "MJExtension.h"
#import "SVProgressHUD.h"
@interface LSTWholeTableController ()
@property(nonatomic,weak)UIView * footerView;
@property(nonatomic,weak)UIView * headerView;
@property(nonatomic,weak)UILabel * footerLabel;
@property(nonatomic,weak)UILabel * headerLabel;
/**加载下一页数据**/
@property (nonatomic, copy) NSString *maxtime;
/**底部是否刷新**/
@property(nonatomic,assign,getter=isHeaderRefreshing)BOOL headerRefreshing;
/**Bool判断是否刷新**/
@property(nonatomic,assign,getter=isRefreshing)BOOL footerRefreshing;
/**模型数组**/
@property(nonatomic,strong)NSMutableArray * wholeData_array;
/**请求数据**/
@property(nonatomic,strong)AFHTTPSessionManager * manager;
@end
@implementation LSTWholeTableController
/**加载View**/
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.backgroundColor=[UIColor greenColor];
/**监听通知**/
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(tabBarButtonClick) name:TabBarButtonRepeatClickNotification object:nil];
[self setupRefresh];
[self loadData];
}
-(void)setupRefresh{
UIView * footerView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 35)];
UILabel * footerLabel=[[UILabel alloc]initWithFrame:footerView.bounds];
footerLabel.text=@"上拉加载更多";
footerLabel.textAlignment=NSTextAlignmentCenter;
footerLabel.backgroundColor=[UIColor orangeColor];
[footerView addSubview:footerLabel];
self.footerView=footerView;
self.footerLabel=footerLabel;
self.tableView.tableFooterView=footerView;
UILabel * label=[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 0, 30)];
label.backgroundColor=[UIColor blackColor];
label.textColor=[UIColor whiteColor];
label.text=@"广告";
label.textAlignment=NSTextAlignmentCenter;
self.tableView.tableHeaderView=label;
/**头部**/
UIView * header=[[UIView alloc]init];
header.backgroundColor=[UIColor brownColor];
header.frame=CGRectMake(0, -50, SCREEN_WIDTH, 50);
self.headerView=header;
[self.tableView addSubview:header];
UILabel * headerLabel=[[UILabel alloc]init];
headerLabel.frame=header.bounds;
headerLabel.text=@"下拉可以刷新";
headerLabel.textColor=[UIColor whiteColor];
headerLabel.textAlignment=NSTextAlignmentCenter;
self.headerLabel=headerLabel;
[header addSubview:headerLabel];
// 让header自动进入刷新
[self headerBeginRefreshing];
}
- (void)headerBeginRefreshing
{
// 如果正在下拉刷新,直接返回
if (self.isHeaderRefreshing) return;
// 进入下拉刷新状态
self.headerLabel.text = @"正在刷新数据...";
self.headerLabel.backgroundColor = [UIColor blueColor];
self.headerRefreshing = YES;
// 增加内边距
[UIView animateWithDuration:0.25 animations:^{
UIEdgeInsets inset = self.tableView.contentInset;
inset.top += self.headerView.height;
self.tableView.contentInset = inset;
// 修改偏移量
self.tableView.contentOffset = CGPointMake(self.tableView.contentOffset.x, - inset.top);
}];
// 发送请求给服务器,下拉刷新数据
[self loadData];
}
#pragma mark - 代理方法
/**
* 用户松开scrollView时调用
*/
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
CGFloat offsetY = - (self.tableView.contentInset.top + self.headerView.height);
if (self.tableView.contentOffset.y <= offsetY) { // header已经完全出现
[self headerBeginRefreshing];
}
}
-(AFHTTPSessionManager *)manager{
if (!_manager) {
_manager=[AFHTTPSessionManager manager];
}
return _manager;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
// 处理header
[self dealHeader];
// 处理footer
[self dealFooter];
}
/**
* 处理footer
*/
- (void)dealFooter
{
// 还没有任何内容的时候,不需要判断
if (self.tableView.contentSize.height == 0) return;
// 当scrollView的偏移量y值 >= offsetY时,代表footer已经完全出现
CGFloat ofsetY = self.tableView.contentSize.height + self.tableView.contentInset.bottom - self.tableView.height;
if (self.tableView.contentOffset.y >= ofsetY
&& self.tableView.contentOffset.y > - (self.tableView.contentInset.top)) { // footer完全出现,并且是往上拖拽
[self footerBeginRefreshing];
}
}
- (void)dealHeader
{
// 如果正在下拉刷新,直接返回
if (self.isHeaderRefreshing) return;
// 当scrollView的偏移量y值 <= offsetY时,代表header已经完全出现
CGFloat offsetY = - (self.tableView.contentInset.top + self.headerView.height);
if (self.tableView.contentOffset.y <= offsetY) { // header已经完全出现
self.headerLabel.text = @"松开立即刷新";
self.headerLabel.backgroundColor = [UIColor grayColor];
} else {
self.headerLabel.text = @"下拉可以刷新";
self.headerLabel.backgroundColor = [UIColor redColor];
}
}
- (void)headerEndRefreshing
{
self.headerRefreshing = NO;
// 减小内边距
[UIView animateWithDuration:0.25 animations:^{
UIEdgeInsets inset = self.tableView.contentInset;
inset.top -= self.headerView.height;
self.tableView.contentInset = inset;
}];
}
-(void)tabBarButtonClick{
if (self.view.window==nil) return;
if (self.tableView.scrollsToTop==NO) return;
}
-(void)dealloc{
[[NSNotificationCenter defaultCenter]removeObserver:self name:TabBarButtonRepeatClickNotification object:nil];
}
#pragma mark 加载数据
-(void)loadData{
NSMutableDictionary * parameters=[NSMutableDictionary dictionary];
parameters[@"a"]=@"list";
parameters[@"c"]=@"data";
parameters[@"type"]=@"1";
[self.manager GET:BaseURL parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, NSDictionary * _Nullable responseObject) {
self.wholeData_array=[LSTWholeModal mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
[self.tableView reloadData];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[SVProgressHUD showErrorWithStatus:@"网络异常,加载失败"];
}];
}
/**
* 发送请求给服务器,上拉加载更多数据
*/
- (void)loadMoreTopics
{
// 1.取消之前的请求
[self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
// 2.拼接参数
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
parameters[@"a"] = @"list";
parameters[@"c"] = @"data";
parameters[@"type"] = @"31";
parameters[@"maxtime"] = self.maxtime;
// 3.发送请求
[self.manager GET:BaseURL parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 存储maxtime
self.maxtime = responseObject[@"info"][@"maxtime"];
// 字典数组 -> 模型数据
NSArray *moreTopics = [LSTWholeModal mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
// 累加到旧数组的后面
[self.wholeData_array addObjectsFromArray:moreTopics];
// 刷新表格
[self.tableView reloadData];
// 结束刷新
[self footerEndRefreshing];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (error.code != NSURLErrorCancelled) { // 并非是取消任务导致的error,其他网络问题导致的error
[SVProgressHUD showErrorWithStatus:@"网络繁忙,请稍后再试!"];
}
// 结束刷新
[self footerEndRefreshing];
}];
}
- (void)footerEndRefreshing
{
self.footerRefreshing = NO;
self.footerLabel.text = @"上拉可以加载更多";
self.footerLabel.backgroundColor = [UIColor redColor];
}
#pragma mark - footer
- (void)footerBeginRefreshing
{
// 如果正在上拉刷新,直接返回
if (self.footerRefreshing) return;
// 进入刷新状态
self.footerRefreshing = YES;
self.footerLabel.text = @"正在加载更多数据...";
self.footerLabel.backgroundColor = [UIColor blueColor];
// 发送请求给服务器,上拉加载更多数据
[self loadMoreTopics];
}
#pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.wholeData_array.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString * const ID=@"cell";
UITableViewCell * cell=[tableView dequeueReusableCellWithIdentifier:ID];
if (!cell) {
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
}
LSTWholeModal * wholeDateModal=self.wholeData_array[indexPath.row];
cell.textLabel.text=wholeDateModal.name;
cell.detailTextLabel.text=wholeDateModal.text;
return cell;
}
@end
自定义刷新tableView的更多相关文章
- MJRefresh自定义刷新动画
[一]常见用法 最原始的用法,耦合度低,但是不能统一管理.我们需要在每一个控制器都写以下代码,很繁琐,以后项目修改起来更繁琐,得一个控制器一个控制器的去定位.修改. 1.1 使用默认刷新(耦合度底,但 ...
- 李洪强iOS开发之 - 指定刷新tableview的某一组
李洪强iOS开发之 - 指定刷新tableview的某一组
- 在模型中获取网络数据,刷新tableView
model .h #import <Foundation/Foundation.h> #import "AFHTTPRequestOperationManager.h" ...
- 刷新 tableview
UITableView对于iOS开发者来说一定不会陌生,很有可能你的APP很多界面都用到它.关于UITableView的文章,想必已经不计其数,没事可以多看看.特别是UITableView优化的文章, ...
- iOS开发——UI进阶篇(四)tableView的全局刷新,局部刷新,左滑操作,左滑出现更多按钮,进入编辑模式,批量删除,自定义批量删除
首先创建项目,在storyboard如下布局控件,设置好约束 然后创建cell模型类XMGWineCell数据模型类XMGWine创建UITableView,设置数据源协议,实现数据源方法懒加载数据这 ...
- IOS详解TableView——内置刷新,EGO,以及搜索显示控制器
内置刷新 内置刷新是苹果IOS6以后才推出的一个API,主要是针对TableViewController增加了一个属性,refreshControl,所以如果想用这个内置下拉刷新的话,最好给你的Tab ...
- 自定义下拉刷新控件-CBStoreHouseRefreshControl
本文转载至 http://www.cocoachina.com/ios/20141110/10177.html iOS开发自定义刷新CBStoreHouseRefres 介绍 这是一款在Storeho ...
- tableView左划自定义带图片按钮
本方法实现的原理是将自定义按钮加在tableViewCell.contentView的屏幕外的frame上,打个比方,如果是5系的话,那么你自定义按钮的frame的起点就在(320+,0)(320+表 ...
- 如何对tableview进行自定义多选
前言: 很多入门不久的程序员或许都会遇到系统自带的tableview多选时cell选择时不能选择自己想要的点击时的颜色或者图片,这让初级开发者们很烦恼.今天,我试着花了几个小时的时间用了自己的想法,去 ...
随机推荐
- HTML 链接 - href
链接 在HTML的学习中,链接的标签发挥着很大的作用,HTML 使用超级链接与网络上的另一个文档相连.几乎可以在所有的网页中找到链接.点击链接可以从一张页面跳转到另一张页面. 比如说:实例 创建超级链 ...
- C++多线程の条件变量
如果有一个队列,方法一和方法二:方法一是生产者,方法二是消费者: 两者不停的相互等待,加减锁,为了减少不必要的等待,我们可以使用条件变量, 条件的变量的第二个参数的加入可以控制多个线程的"消 ...
- EF常用命令行
启用迁移:指定迁移的目录和数据库上下文名称Enable-Migrations -MigrationsDirectory "MigrationsHis" -ContextTypeNa ...
- tsne官方论文代码解读和使用
MLGB,人生就是矫情,充满冲动,充满热恋. tsne的08年的论文看了几遍,发现原理还是蛮简单的,能想到还是不容易(人生的战场是星辰大海,但我们的贡献就是也就是宇宙尘埃) 怎么说呢,现在真的是一个好 ...
- [SAP ABAP开发技术总结]ABAP调优——代码优化
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- XML特殊符号
在XML中"<" 字符和"&"字符是严格禁止使用的.要使用这几种字符需要使用它们的实体, 下面是五个在XML文档中预定义好的实体:< < ...
- 使用Gson转换json数据为Java对象的一个例子
记录工作中碰到的一个内容. 原料是微信平台的一个接口json数据. { "errcode" : 0, "errmsg" : "ok", &q ...
- 调用微信JsAPI端获取位置
public partial class test : BasePage { protected test() { AccessPage = PageWebType.WX; } protected s ...
- spring4+websocket+nginx详细配置
实现的版本jdk1.7.0_25, tomcat7.0.47.0, Tengine/2.1.1 (nginx/1.6.2), servlet3.0, spring4.2.2 使用maven导入版本3. ...
- easyui 随笔
问题1:easyui-datagrid中,如果装载datagrid的表格通过javascript 或者 jquery 来resize,那么将会reload重新加载数据.这样当我们调整的时候不得不重新发 ...