admin 发表于 2014-8-27 12:50:50

ios最简单的方式实现下拉刷新功能

1、下载第三方下拉刷新控件,推荐MJRefresh
2、利用系统自带的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

admin 发表于 2014-8-27 12:52:20

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]
查看完整版本: ios最简单的方式实现下拉刷新功能