转自: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
|
@interface
FootView : 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
|
#
import
FootView.h
@implementation
FootView
@synthesize
activity;
@synthesize
imageView;
@synthesize
infolabel;
@synthesize
refreshState;
- (id)initWithFrame:(CGRect)frame
{
self = [
super
initWithFrame: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:
@Helvetica
size:
20
];
infolabel.textAlignment = NSTextAlignmentCenter;
infolabel.textColor = [UIColor blackColor];
[self addSubview:infolabel];
//设置初始状态
self.refreshState = RefreshStateNomal;
}
return
self;
}
//初始状态
- (
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=
""
>
@interface
MyTableVC : 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
|
#
import
MyTableVC.h
#
import
FootView.h
#define TABLE_CELL_HIGHT
50.0
@interface
MyTableVC ()
@end
@implementation
MyTableVC
{
FootView *footView;
}
@synthesize
dataArray;
- (id)initWithStyle:(UITableViewStyle)style
{
self = [
super
initWithStyle:style];
if
(self) {
}
return
self;
}
- (
void
)viewDidLoad
{
[
super
viewDidLoad];
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:
@dataArray
options:NSKeyValueObservingOptionNew context:nil];
}
#pragma mark - Table view data source
- (
float
)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return
TABLE_CELL_HIGHT;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return
1
;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return
dataArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static
NSString *inditifierCell =
@Cell
;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:inditifierCell];
if
(cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:inditifierCell];
}
cell.textLabel.text = [dataArray objectAtIndex:indexPath.row];
return
cell;
}
- (
void
)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSMutableArray *
new
= [[NSMutableArray alloc]initWithArray:dataArray];
[
new
addObject:@张三];
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
|