caipivara
12/15/2014 - 6:53 PM

Category to add pull to refresh to any UIScrollView

Category to add pull to refresh to any UIScrollView

//
// UIScrollView+PullToRefresh.h
// Created by Ben Kreeger (@kreeger), 2013/01/23.
//

#import <UIKit/UIKit.h>

/** Adds pull to refresh for a UIScrollView (or a UITableView). Abstracts away differences in frameworks between iOS 6
 *  and iOS 5 (in the case of the latter, `ODRefreshControl` is used.
 */
@interface UIScrollView (PullToRefresh)

@property (strong, nonatomic) UIControl *pullToRefreshView;
@property (strong, nonatomic) void (^pullToRefreshBlock)(void);
@property (readonly) BOOL refreshing;

/** Sets up the scroll view with a pull-to-refresh view, and saves the callback block for when the view is triggered.
 *  This sets up the default color of the pull-to-refresh view to be `grayColor`.
 *  @param block the block to be called when the scroll view is pulled on.
 */
- (void)addPullToRefreshWithActionHandler:(void (^)(void))block;

/** Sets up the scroll view with a pull-to-refresh view, and saves the callback block for when the view is triggered.
 *  Also allows for a tint color to be saved on the pull-to-refresh view.
 *  @param block the block to be called when the scroll view is pulled on.
 *  @param tintColor the tint color to use on the pull-to-refresh view.
 */
- (void)addPullToRefreshWithActionHandler:(void (^)(void))block tintColor:(UIColor *)tintColor;

/** Tells the pull-to-refresh view to begin refreshing.
 */
- (void)beginRefreshing;

/** Tells the pull-to-refresh view to end refreshing.
 */
- (void)endRefreshing;

/** Calls the saved pull-to-refresh block.
 */
- (void)triggerPullToRefresh;

@end

//
// UIScrollView+PullToRefresh.m
// Created by Ben Kreeger (@kreeger), 2013/01/23.
//

#import "UIScrollView+PullToRefresh.h"
#import <objc/runtime.h>
#import <Availability.h>

#if defined(__IPHONE_5_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0
#import <ODRefreshControl/ODRefreshControl.h>
#endif

static const void *PullToRefreshViewKey = &PullToRefreshViewKey;
static const void *PullToRefreshBlockKey = &PullToRefreshBlockKey;

@implementation UIScrollView (PullToRefresh)

@dynamic pullToRefreshView, pullToRefreshBlock;

- (void)addPullToRefreshWithActionHandler:(void (^)(void))block {
    [self addPullToRefreshWithActionHandler:block tintColor:[UIColor grayColor]];
}

- (void)addPullToRefreshWithActionHandler:(void (^)(void))block tintColor:(UIColor *)tintColor {
    if (NSClassFromString(@"UIRefreshControl")) {
        self.pullToRefreshView = [[UIRefreshControl alloc] init];
        [self addSubview:self.pullToRefreshView];
        ((UIRefreshControl *)self.pullToRefreshView).tintColor = tintColor;
    } else {
        self.pullToRefreshView = [[ODRefreshControl alloc] initInScrollView:self];
        ((ODRefreshControl *)self.pullToRefreshView).tintColor = tintColor;
    }
    
    self.pullToRefreshBlock = block;
    [self.pullToRefreshView addTarget:self action:@selector(triggerPullToRefresh)
                     forControlEvents:UIControlEventValueChanged];
}

- (void)triggerPullToRefresh {
    self.pullToRefreshBlock();
}

- (void)beginRefreshing {
    if (NSClassFromString(@"UIRefreshControl")) {
        [(UIRefreshControl *)self.pullToRefreshView beginRefreshing];
    } else {
        [(ODRefreshControl *)self.pullToRefreshView beginRefreshing];
    }
}

- (void)endRefreshing {
    if (NSClassFromString(@"UIRefreshControl")) {
        [(UIRefreshControl *)self.pullToRefreshView endRefreshing];
    } else {
        [(ODRefreshControl *)self.pullToRefreshView endRefreshing];
    }
}

- (BOOL)refreshing {
    if (NSClassFromString(@"UIRefreshControl")) {
        return [(UIRefreshControl *)self.pullToRefreshView isRefreshing];
    } else {
        return [(ODRefreshControl *)self.pullToRefreshView refreshing];
    }
}

- (UIControl *)pullToRefreshView {
    return objc_getAssociatedObject(self, PullToRefreshViewKey);
}

- (void)setPullToRefreshView:(UIControl *)pullToRefreshView {
    objc_setAssociatedObject(self, PullToRefreshViewKey, pullToRefreshView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (void (^)(void))pullToRefreshBlock {
    return objc_getAssociatedObject(self, PullToRefreshBlockKey);
}

- (void)setPullToRefreshBlock:(void (^)(void))pullToRefreshBlock {
    objc_setAssociatedObject(self, PullToRefreshBlockKey, pullToRefreshBlock, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end