ios最简单的方式实现下拉刷新功能
1、下载第三方下拉刷新控件,推荐MJRefresh2、利用系统自带的UIRefreshControl:只适应于UITableViewControl,如果是UIViewControl上加的TableView则无法使用;
3、重写UITableView,自定义下拉刷新功能,代码如下:
//
//SABaseTableView.m
//
//Created by Sian on 14-8-6.
//Copyright (c) 2014年 Sian. All rights reserved.
//
#import "SABaseTableView.h"
@interface SABaseTableView ()
{
UILabel *_headBase;
UILabel *_footBase;
UIActivityIndicatorView *_indicator;
CGFloat _space;
}
@end
@implementation SABaseTableView
#pragma mark - 初始化
- (id)initWithFrame:(CGRect)frame
{
self = ;
if (self) {
self.backgroundColor = kGrayColor(0.9);
_space = 60.0;
_headBase = [ init];
_headBase.backgroundColor = ;
_headBase.text = @"下拉可以刷新";
_headBase.textColor = kGrayColor(0.5);
_headBase.font = ;
_headBase.textAlignment = NSTextAlignmentCenter;
;
_footBase = [ init];
_footBase.backgroundColor = ;
_footBase.text = @"上拉加载更多";
_footBase.textColor = kGrayColor(0.5);
_footBase.font = ;
_footBase.textAlignment = NSTextAlignmentCenter;
;
_indicator = [ init];
_indicator.center = CGPointMake(50, _space * 0.5);
_indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;
;
}
return self;
}
#pragma mark 调整子控件
- (void)layoutSubviews
{
;
_headBase.frame = CGRectMake(0, -_space, self.frame.size.width, _space);
_footBase.frame = (CGRect){0, self.contentSize.height, _headBase.frame.size};
;
}
#pragma mark 监听TableView滑动区域
- (void)tableViewDraggingEven
{
CGFloat subtract = iOS7 ? (64 - self.superview.frame.origin.y) : 0;
CGFloat y = self.contentOffset.y + subtract;
CGFloat offsetMax = self.contentSize.height - self.frame.size.height;
// ContentSize范围内
if (y > 0 && y < offsetMax)
return;
// 触发刷新条件
if (!self.isDragging && self.refreshState == REFRESH_PULLING)
self.refreshState = REFRESH_REFRESHING;
// 准备刷新范围
if ((y > -_space && y < 0) || (y > offsetMax && y < offsetMax + _space))
self.refreshState = REFRESH_NORMAL;
// 即将刷新范围
if (y < -_space || y > offsetMax + _space + subtract)
self.refreshState = REFRESH_PULLING;
self.refreshType = (y < 0) ? REFRESH_LATEST : REFRESH_MORE;
}
#pragma mark - 根据状态定义不同状态下的视图与动作
- (void)setRefreshState:(REFRESH_STATE)refreshState
{
CGFloat subtract = iOS7 ? (64 - self.superview.frame.origin.y) : 0;
REFRESH_TYPE refreshType = (self.contentOffset.y < 0) ? REFRESH_LATEST : REFRESH_MORE;
if (_refreshType == refreshType && _refreshState == REFRESH_REFRESHING)return;
_refreshType = refreshType;
if(_refreshState == refreshState) return;
_refreshState = refreshState;
switch (refreshState) {
// 正常状态
case REFRESH_NORMAL:
_headBase.text = @"下拉可以刷新";
_footBase.text = @"上拉加载更多";
break;
// 即将刷新
case REFRESH_PULLING:
_headBase.text = @"释放即可刷新";
_footBase.text = @"释放加载更多";
break;
// 正在刷新
case REFRESH_REFRESHING:
_headBase.text = @"正在刷新中...";
_footBase.text = @"正在加载中...";
;
{
CGFloat offsetMax = self.contentSize.height - self.frame.size.height;
UIEdgeInsets edgeInset = UIEdgeInsetsZero;
edgeInset.top = (self.refreshType == REFRESH_LATEST) ? _space + subtract : subtract;
edgeInset.bottom = (self.refreshType == REFRESH_MORE) ? _space: 0;
CGPoint offset = CGPointZero;
offset.y = (self.refreshType == REFRESH_LATEST) ? -_space - subtract: offsetMax + _space;
[UIView animateWithDuration:0.3 animations:^{
self.contentInset = edgeInset;
self.contentOffset = offset;
}];
}
;
[(self.refreshType == REFRESH_LATEST) ? _headBase : _footBase addSubview:_indicator];
break;
default:
break;
}
}
#pragma mark - 刷新时执行方法
- (void)refreshWithType:(REFRESH_TYPE)refreshType
{
switch (refreshType) {
case REFRESH_LATEST:
NSLog(@"下拉刷新...");
break;
case REFRESH_MORE:
NSLog(@"上拉加载更多...");
break;
default:
break;
}
}
#pragma mark 停止刷新
- (void)endRefresh
{
[UIView animateWithDuration:0.3 animations:^{
self.contentInset = UIEdgeInsetsZero;
;
;
}];
}
@end
进入刷新状态会自动调用方法- (void)refreshWithType:(REFRESH_TYPE)refreshType SABaseTableView.h
#import <UIKit/UIKit.h>
typedef enum{
REFRESH_NORMAL = 0, // 常规状态
REFRESH_PULLING = 1, // 准备刷新
REFRESH_REFRESHING= 2, // 正在刷新
}REFRESH_STATE;
@interface SABaseTableView : UITableView
@property (nonatomic, assign) REFRESH_TYPE refreshType;
@property (nonatomic, assign) REFRESH_STATE refreshState;
// 正在刷新调用方法
- (void)refreshWithType:(REFRESH_TYPE)refreshType;
// 结束刷新
- (void)endRefresh;
@end
页:
[1]