/MSPullToRefreshController

pull to refresh controller

Primary LanguageObjective-CMIT LicenseMIT

Miso's Pull To Refresh Library (blog post here)

Authors

Me and Tim Lee

Pull To Refresh Demo

I've put together a simple sample project that recreates our familiar rainbow loading in the Miso App. The sample artificially creates async work by finding the next largest prime and putting the results into a regular uitableview.

Features

  • does not steal your scrollview's delegate (intrusive), but merely observes the scrollview's contentOffset property (non-intrusive)
  • allows refreshing in all 4 directions (pull down to refresh, pull up to load more?)

How To Use

Note that this library merely abstracts away the refresh cycle logic. It is up to the developer to use this class combined with custom views to create a complete, visually satisfactory solution.

There's only one constructor:

MSPullToRefreshController *ptrc = [[MSPullToRefreshController alloc] initWithScrollView:scrollView delegate:self];

As the Delegate, you must implement these methods to inform the library of your specific refresh requirements:

/*
 * asks the delegate which refresh directions it would like enabled
 */
- (BOOL) pullToRefreshController:(MSPullToRefreshController *) controller canRefreshInDirection:(MSRefreshDirection)direction;

/*
 * inset threshold to engage refresh
 */
- (CGFloat) pullToRefreshController:(MSPullToRefreshController *) controller refreshableInsetForDirection:(MSRefreshDirection) direction;

/*
 * inset that the direction retracts back to after refresh started
 */
- (CGFloat) pullToRefreshController:(MSPullToRefreshController *)controller refreshingInsetForDirection:(MSRefreshDirection)direction;

You may (it is in your best interest to) to implement these methods in order to transform your custom views based on where you are in the refresh cycle:

/*
 * informs the delegate that lifting your finger will trigger a refresh
 * in that direction. This is only called when you cross the refreshable
 * offset defined in the respective MSInflectionOffsets.
 */
- (void) pullToRefreshController:(MSPullToRefreshController *) controller canEngageRefreshDirection:(MSRefreshDirection) direction;

/*
 * informs the delegate that lifting your finger will NOT trigger a refresh
 * in that direction. This is only called when you cross the refreshable
 * offset defined in the respective MSInflectionOffsets.
 */
- (void) pullToRefreshController:(MSPullToRefreshController *) controller didDisengageRefreshDirection:(MSRefreshDirection) direction;

/*
 * informs the delegate that refresh sequence has been started by the user
 * in the specified direction. A good place to start any async work.
 */
- (void) pullToRefreshController:(MSPullToRefreshController *) controller didEngageRefreshDirection:(MSRefreshDirection) direction;

Note that you must manually end a refresh cycle in any direction:

[ptrc finishRefreshingDirection:MSRefreshDirectionTop animated:NO];

You can also programatically start a refresh cycle in any direction:

[ptrc startRefreshingDirection:MSRefreshDirectionTop animated:YES];

Caution

This library will break down if the area of the scrollView's contentSize is smaller (strict) than the area of the scrollView's frame. It is up to the developer to ensure the converse.

License

MSPullToRefreshController is available under the MIT license. See the LICENSE file for more info.