爲練手寫了一個小的上拉載入不少其它下拉刷新的小的Dome 。數組
沒有太多的技術含量,僅僅是做爲新手的啓示用。是上一篇下拉載入的擴展。先看一下那個再看這個就easy很是多。網絡
Dome下載:http://download.csdn.net/detail/u010123208/8062715ide
先來梳理一下:atom
上拉家在不少其它就是上拉以後在底部現實一個視圖,用來提示用戶上拉載入不少其它,假設用戶上拉就出發事件。進行載入並在試圖中給予提示,同一時候後臺載入數據,將加入的數據加入數據數組,最後又一次導入列表;url
下拉刷新相同的操做,僅僅只是就是將數組清空又一次來導入數據;.net
首先咱們要建立兩個view 一個是頂部顯示,一個在底部顯示 ;代理
在view中要顯示現在文字,一張圖片,一個活動指示框(當進行網絡請求載入數據的時候顯示。其它時候隱藏),假設不太理解下載Dome看一下就知道了。code
typedef enum { InsertStateNomal, //尋常狀態 InsertStateDrapUp, //上拉狀態 InsertStateDrapDown, //下拉狀態 InsertStateRun, //正在載入的狀態 }InsertState; @interface HeadView : UIView @property (nonatomic,strong) UIImageView *imageView; @property (nonatomic,strong) UILabel *label; @property (nonatomic,assign) InsertState insertState; @property (nonatomic,strong) UIActivityIndicatorView *activity; - (void)setInsertNomal; - (void)setInsertDrapDown; - (void)setInsertRun; @end @interface FootView : UIView @property (nonatomic,strong) UIImageView *imageView; @property (nonatomic,strong) UILabel *label; @property (nonatomic,assign) InsertState insertState; @property (nonatomic,strong) UIActivityIndicatorView *activity; - (void)setInsertNomal; - (void)setInsertDrapDoUp; - (void)setInsertRun; @end
事實上兩個視圖的內容什麼的都全然同樣;orm
// // InsertView.m // RefreshDome // // Created by 小屁孩 on 14-10-16. // Copyright (c) 2014年 XS. All rights reserved. // #import "InsertView.h" @implementation HeadView @synthesize imageView; @synthesize label; @synthesize insertState; @synthesize activity; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor orangeColor]; //圖片 imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"arrow.png"]]; imageView.frame = CGRectMake(20, frame.size.height-60, 30, 50); [self addSubview:imageView]; //顯示的文字 label = [[UILabel alloc]initWithFrame:CGRectMake(60, frame.size.height-60, 250, 50)]; label.text = @"下拉刷新..."; label.textAlignment = NSTextAlignmentCenter; [self addSubview:label]; //狀態 insertState = InsertStateNomal; //活動指示器 activity = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; activity.frame = CGRectMake(20,frame.size.height-60, 30, 50); [self addSubview:activity]; } return self; } //初始狀態 -(void)setInsertNomal { insertState = InsertStateNomal; label.text = @"下拉刷新....."; imageView.layer.transform = CATransform3DMakeRotation(M_PI*2, 0, 0, 1); [activity stopAnimating]; imageView.hidden =NO; } //下拉狀態 - (void)setInsertDrapDown { insertState = InsertStateDrapDown; [UIView beginAnimations:nil context:nil]; label.text = @"釋放後刷新....."; imageView.layer.transform = CATransform3DMakeRotation(M_PI, 0, 0, 1); [UIView commitAnimations]; } //刷新狀態 - (void)setInsertRun { insertState =InsertStateRun; label.text = @"正在刷新....."; imageView.hidden = YES; [activity startAnimating]; } @end @implementation FootView @synthesize imageView; @synthesize label; @synthesize insertState; @synthesize activity; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor orangeColor]; //圖片 imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"arrow.png"]]; imageView.layer.transform = CATransform3DMakeRotation(M_PI , 0, 0, 1); imageView.frame = CGRectMake(20, 10, 30, 50); [self addSubview:imageView]; //文字 label = [[UILabel alloc]initWithFrame:CGRectMake(60, 10, 250, 50)]; label.text = @"上拉載入不少其它....."; label.textAlignment = NSTextAlignmentCenter; [self addSubview:label]; //狀態 insertState = InsertStateNomal; //活動指示器 activity = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; activity.frame = CGRectMake(20, 10, 30, 50); [self addSubview:activity]; } return self; } //初始狀態 - (void)setInsertNomal { insertState = InsertStateNomal; label.text = @"上拉載入不少其它....."; imageView.layer.transform = CATransform3DMakeRotation(M_PI , 0, 0, 1); [activity stopAnimating]; imageView.hidden =NO; } //上拉狀態 - (void)setInsertDrapDoUp { insertState = InsertStateDrapUp; [UIView beginAnimations:nil context:nil]; label.text = @"釋放後載入不少其它....."; imageView.layer.transform = CATransform3DMakeRotation(M_PI * 2, 0, 0, 1); [UIView commitAnimations]; } //載入狀態 - (void)setInsertRun { insertState = InsertStateRun; label.text = @"正在載入....."; imageView.hidden = YES; [activity startAnimating]; } @end
最後就是列表了;server
事實上在這裏面需要注意的:
#import <UIKit/UIKit.h> #import "InsertView.h" @interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate,UIScrollViewDelegate> @property (weak, nonatomic) IBOutlet UITableView *table; @property (nonatomic,strong) NSMutableArray *tableArray; @end
#import "ViewController.h" @interface ViewController () @end @implementation ViewController { HeadView *headView; FootView *footView; } @synthesize tableArray; @synthesize table; - (void)viewDidLoad { [super viewDidLoad]; table.frame = CGRectMake(0, 20, 320, [[UIScreen mainScreen]bounds].size.height-20); table.delegate = self; table.dataSource = self; table.tableFooterView = [[UIView alloc]init]; //下拉頭部視圖 headView = [[HeadView alloc]initWithFrame:CGRectMake(0, -251, DEVICE_FRAME.size.width, 251)]; [table addSubview:headView]; //上拉底部視圖 footView = [[FootView alloc]initWithFrame:CGRectMake(0, table.frame.size.height, DEVICE_FRAME.size.width, 251)]; [table addSubview:footView]; //初始化數組 tableArray = [NSMutableArray array]; for (int i = 0; i<15; i++) { NSURL *url=[NSURL URLWithString:@"http://www.sinaimg.cn/qc/photo_auto/chezhan/2012/50/00/15/80046_950.jpg"]; UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]]; [tableArray addObject:image]; } float hight =tableArray.count * 60 ; if (tableArray.count * 60 < [[UIScreen mainScreen]bounds].size.height ) { hight = table.frame.size.height; } footView.frame = CGRectMake(0, hight, 320, 251); [self addObserver:self forKeyPath:@"tableArray" options:NSKeyValueObservingOptionNew context:nil]; } - (void) addtableMutableArray { for (int i = 0; i<5; i++) { NSURL *url=[NSURL URLWithString:@"http://www.sinaimg.cn/qc/photo_auto/chezhan/2012/50/00/15/80046_950.jpg"]; UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]]; [self.tableArray addObject:image]; } self.tableArray = tableArray; [footView setInsertNomal]; [self performSelectorOnMainThread:@selector(endThread) withObject:nil waitUntilDone:NO]; } - (void)endThread { [UIView beginAnimations:nil context:nil]; table.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); [UIView commitAnimations]; [table reloadData]; NSLog(@"%d",tableArray.count); } - (void) refesh { NSMutableArray *array = [NSMutableArray array]; for (int i = 0; i<15; i++) { NSURL *url=[NSURL URLWithString:@"http://wenwen.sogou.com/p/20110923/20110923201826-1347223277.jpg"]; UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]]; [array addObject:image]; } self.tableArray = array; [headView setInsertNomal]; [self performSelectorOnMainThread:@selector(endThread) withObject:nil waitUntilDone:NO]; } #pragma mark KVO -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSMutableArray *array = [change objectForKey:@"new"]; float hight =array.count * 60; if (array.count * 60 < [[UIScreen mainScreen]bounds].size.height ) { hight = [[UIScreen mainScreen]bounds].size.height; } footView.frame = CGRectMake(0, hight, 320, 251); } #pragma mark tabledelegate - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return tableArray.count; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 60; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *identityCell = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identityCell]; if (cell == nil) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identityCell]; } cell.imageView.image = [tableArray objectAtIndex:indexPath.row]; cell.textLabel.text = @"NibBi"; return cell; } #pragma mark - scrolldelegae - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { if (headView.insertState == InsertStateDrapDown) { [UIView beginAnimations:nil context:nil]; table.contentInset = UIEdgeInsetsMake(70, 0, 0, 0); [headView setInsertRun]; [UIView commitAnimations]; [self performSelectorInBackground:@selector(refesh) withObject:nil]; } if (footView.insertState == InsertStateDrapUp) { [UIView beginAnimations:nil context:nil]; table.contentInset = UIEdgeInsetsMake(0, 0, 70, 0); [footView setInsertRun]; [UIView commitAnimations]; [self performSelectorInBackground:@selector(addtableMutableArray) withObject:nil]; } } -(void)scrollViewDidScroll:(UIScrollView *)scrollView { // NSLog(@"%f",scrollView.contentOffset.y); //上拉載入不少其它轉換 if (scrollView.contentOffset.y > scrollView.contentSize.height - scrollView.frame.size.height + 60 && footView.insertState == InsertStateNomal) { [UIView beginAnimations:nil context:nil]; [footView setInsertDrapDoUp]; [UIView commitAnimations]; } //下拉刷新轉換 if (scrollView.contentOffset.y < -60 && headView.insertState == InsertStateNomal) { [UIView beginAnimations:nil context:nil]; [headView setInsertDrapDown]; [UIView commitAnimations]; } } @end