下拉刷新
百度一下,基本上都是三方库,MJ的,EGO的等等,基本没有自己写的(估计是我姿势不对),所以就自己想写一个,其实也很简单,下边说下原理
2. 可以在屏幕外边放一个view,然后滑动的时候,改变他的frame,让他跟着出来
3. 然后松手的时候,view移动到一个位置,tableView也定到一个位置,然后开始请求数据
4. 请求完数据之后,让view回去,tableView也回到原来的位置,然后重载数据
这就是基本的思路,不会画图,大家自己理解下吧,
这个方法会在tableView滚动的时候一直调用,所以,这里可以让view跟着tableView下拉出现,效果还是挺好的
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
这个方法会在手指抬起的时候调用,这里可以让tableView和view定到一个合理的位置
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
请求完数据之后,在恢复
思路就是这样,下边是代码,这里用到了AFnetWorking这个三方库,用来请求数据,接口是爱限免的,这里用了两个view,一个充当背景,一个用来显示文字,考虑到可扩展性,这样还是比较合理的,一个也是完全可以的,有一个背景的话,还可以加更多的东西
贴个图看看,帧数不够,看不出来,数据比较小,所以立马就出来了,动画可以自己修改,随便搞
#import "ViewController.h"
#import "AFNetworking.h"
@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
@property(strong, nonatomic)UITableView * tableView;
@property(strong, nonatomic)UIView * refreshView;
@property(strong, nonatomic)UILabel * refreshLabel;
@property(assign, nonatomic)NSInteger page;
@property(strong, nonatomic)NSMutableArray * dataArray;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_page = 1;
[self createRefreshView];
[self createTableView];
[self createData];
_dataArray = [[NSMutableArray alloc]init];
}
-(void)createRefreshView
{
_refreshView = [[UIView alloc]initWithFrame:CGRectMake(0, -100, 375, 100)];
_refreshView.backgroundColor = [UIColor whiteColor];
_refreshLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 375, 100)];
_refreshLabel.text = @"下拉刷新";
_refreshLabel.font = [UIFont systemFontOfSize:30];
_refreshLabel.textColor = [UIColor redColor];
_refreshLabel.textAlignment = NSTextAlignmentCenter;
[_refreshView addSubview:_refreshLabel];
[self.view addSubview:_refreshView];
}
-(void)createTableView
{
_tableView = [[UITableView alloc]initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStylePlain];
_tableView.dataSource = self;
_tableView.delegate = self;
[self.view addSubview:_tableView];
}
-(void)createData
{
NSString * path = [NSString stringWithFormat:@"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=%ld",_page];
AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];
[manager GET:path parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
[_dataArray removeAllObjects];
NSArray * array = [responseObject objectForKey:@"applications"];
for (NSDictionary * temp in array) {
[_dataArray addObject:[temp objectForKey:@"name"]];
}
[UIView animateWithDuration:0.2 animations:^{
_tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
} completion:^(BOOL finished) {
_refreshLabel.text = @"下拉刷新";
[_tableView reloadData];
}];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 80;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return _dataArray.count;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString * string = @"cellID";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:string];
if (!cell) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:string];
}
cell.textLabel.text = [_dataArray objectAtIndex:indexPath.row];
return cell;
}
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
NSLog(@"contentOffset : %@",NSStringFromCGPoint(scrollView.contentOffset));
NSLog(@"contentSize : %@",NSStringFromCGSize(scrollView.contentSize));
NSLog(@"frame : %@",NSStringFromCGRect(scrollView.frame));
[UIView animateWithDuration:0.1 animations:^{
_refreshView.frame = CGRectMake(0, -100-scrollView.contentOffset.y, 375, 100);
[self.view bringSubviewToFront:_refreshView];
}];
}
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if (scrollView.contentOffset.y < -150)
{
_tableView.contentInset = UIEdgeInsetsMake(100, 0, 0, 0);
_refreshLabel.text = @"正在刷新";
[self createData];
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end