转自:http://blog.csdn.net/u013626002/article/details/46415315
想试一下上拉加载更多怎么实现开始自己的研究之旅,看了两天终于做出了界面。
之所以这么慢是因为,我不知道要将上拉出现的view放在哪,就能在scrollView拉到底部的时候被拉出来。还有就是怎么拉出来之后停在这里。网上下载例子之后研究了两天:
先说一下,在下面处理图片中橘色view的位置的时候用了kvo进行了监听;
先一个枚举 来指示目前刷新view是在哪个状态:
|
1
2
3
4
5
|
typedef enum{
RefreshStateLoading =1,//刷新状态为正在加载
RefreshStateRelease, //下拉完成释放之前
RefreshStateNomal, //原始状态
}RefreshState; |
下面一个类view来描述刷新view
|
1
2
3
4
5
6
7
8
9
10
11
12
|
@interfaceFootView : UIView
@property (nonatomic,strong) UIActivityIndicatorView *activity;//活动指示条
@property (nonatomic,strong) UIImageView *imageView; //箭头图片
@property (nonatomic,strong) UILabel *infolabel; //文字指示
@property (nonatomic,assign) RefreshState refreshState; //刷新的状态
- (void)refreshStateLoading;
- (void)refreshStateNomal;
- (void)refreshStateRelsease;
@end |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
#importFootView.h
@implementationFootView
@synthesizeactivity;
@synthesizeimageView;
@synthesizeinfolabel;
@synthesizerefreshState;
- (id)initWithFrame:(CGRect)frame{ self = [superinitWithFrame:frame];
if(self) {
self.backgroundColor = [UIColor orangeColor];
//活动指示器初始化
activity = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
activity.frame = CGRectMake(10,0, 50,70);
[self addSubview:activity];
//箭头图片初始化
imageView = [[UIImageView alloc]initWithFrame:CGRectMake(10,10, 30,50)];
imageView.image = [UIImage imageNamed:@blackArrow.png];
[self addSubview:imageView];
//信息label初始化
infolabel = [[UILabel alloc]initWithFrame:CGRectMake(100,0,100,70)];
infolabel.text = @下拉刷新...;
infolabel.font = [UIFont fontWithName:@Helveticasize:20];
infolabel.textAlignment = NSTextAlignmentCenter;
infolabel.textColor = [UIColor blackColor];
[self addSubview:infolabel];
//设置初始状态
self.refreshState = RefreshStateNomal;
}
returnself;
}//初始状态- (void)refreshStateNomal
{ self.refreshState = RefreshStateNomal;
[self.activity stopAnimating];
self.infolabel.text = @下拉加载更多...;
self.imageView.layer.transform = CATransform3DMakeRotation(M_PI *2, 0,0, 1);
self.imageView.hidden = NO;
}//正在请求数据时- (void)refreshStateLoading
{ self.refreshState = RefreshStateLoading;
self.imageView.hidden = YES;
[UIView beginAnimations:nil context:nil];
self.infolabel.text = @正在加载...;
[self.activity startAnimating];
[UIView commitAnimations];
}//下拉完成后- (void)refreshStateRelsease
{ self.refreshState = RefreshStateRelease;
[UIView beginAnimations:nil context:nil];
self.infolabel.text = @释放后加载...;
self.imageView.layer.transform = CATransform3DMakeRotation(M_PI,0, 0,1);
[UIView commitAnimations];
}@end |
|
1
2
3
4
5
6
7
8
|
#import<uikit uikit.h="">
@interfaceMyTableVC : UITableViewController<uiscrollviewdelegate>
@property (nonatomic,strong) NSMutableArray *dataArray;//数据
@end</uiscrollviewdelegate></uikit>
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
#importMyTableVC.h
#importFootView.h
#define TABLE_CELL_HIGHT50.0
@interfaceMyTableVC ()
@end@implementationMyTableVC
{ FootView *footView;
}@synthesizedataArray;
- (id)initWithStyle:(UITableViewStyle)style{ self = [superinitWithStyle:style];
if(self) {
}
returnself;
}- (void)viewDidLoad
{ [superviewDidLoad];
dataArray = [NSMutableArray arrayWithArray:@[@列表1,@列表2,@列表3,@列表2,@列表3,@列表2,@列表3,@列表2,@列表3,@列表2,@列表3,@列表2,@列表3,@列表2,@列表5]];
[self addPullToRefreshFooter];
}//添加FootView指示器- (void)addPullToRefreshFooter
{ //FootView初始化
footView = [[FootView alloc]initWithFrame:CGRectMake(0, dataArray.count*50, 320,251)];
[self.tableView addSubview:footView];
//监视数据数组
[self addObserver:self forKeyPath:@dataArrayoptions:NSKeyValueObservingOptionNew context:nil];
}#pragma mark - Table view data source- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{ returnTABLE_CELL_HIGHT;
}- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return1;
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ returndataArray.count;
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ staticNSString *inditifierCell = @Cell;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:inditifierCell];
if(cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:inditifierCell];
}
cell.textLabel.text = [dataArray objectAtIndex:indexPath.row];
returncell;
}- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{ NSMutableArray *new= [[NSMutableArray alloc]initWithArray:dataArray];
[newaddObject:@张三];
self.dataArray =new;
[footView refreshStateNomal];
self.tableView.contentInset = UIEdgeInsetsMake(0,0, 0,0);
}#pragma mark - kvo//用于监听dataArray数组来设置footview的位置- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context
{ NSLog(@%d,dataArray.count);
NSMutableArray *mutableArray = [change objectForKey:@new];
footView.frame = CGRectMake(0,TABLE_CELL_HIGHT* mutableArray.count,320, 251);
[self.tableView reloadData];
}#pragma mark - Scroller//当scroller滑动时调用- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{ if(footView.refreshState == RefreshStateNomal&& scrollView.contentOffset.y > scrollView.contentSize.height - scrollView.frame.size.height +70) {
[footView refreshStateRelsease];
}
}//当滑动结束时调用- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{ if(footView.refreshState == RefreshStateRelease) {
[UIView beginAnimations:nil context:nil];
self.tableView.contentInset = UIEdgeInsetsMake(0,0, 70,0);
[footView refreshStateLoading];
[UIView commitAnimations];
}
}@end |