转自:http://blog.csdn.net/u013626002/article/details/46415315

想试一下上拉加载更多怎么实现开始自己的研究之旅,看了两天终于做出了界面。

之所以这么慢是因为,我不知道要将上拉出现的view放在哪,就能在scrollView拉到底部的时候被拉出来。还有就是怎么拉出来之后停在这里。网上下载例子之后研究了两天:

ios-上拉加载更多的界面ios-上拉加载更多的界面ios-上拉加载更多的界面

 

先说一下,在下面处理图片中橘色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,050,70);
        [self addSubview:activity];
         
        //箭头图片初始化
        imageView = [[UIImageView alloc]initWithFrame:CGRectMake(10,1030,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 *20,01);
    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,00,1);
    [UIView commitAnimations];
     
}
 
 
 
@end
下面来写table

 

 

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*50320,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,00,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,320251);
    [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,070,0);
        [footView refreshStateLoading];
        [UIView commitAnimations];
    }
}
 
@end


相关文章: