UIRefreshControl not showing spiny when calling beginRefreshing and contentOffset is 0

Peter Lapisu picture Peter Lapisu · Apr 20, 2013 · Viewed 13.7k times · Source

I am not able to see the loading spinner when calling beginRefreshing

[self.refreshControl beginRefreshing];

My UITableViewController subclass uses a UIRefreshControl

// refresh
    UIRefreshControl * refreshControl = [UIRefreshControl new];
    [refreshControl addTarget:self action:@selector(refreshTableView) forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;

It is working perfectly with user interaction (when the user drops the table down), then the spinner is visible.

But when i call beginRefreshing on viewDidLoad, I don't see the spinner (only when i drag the table down).

Notes:

  • self.refreshControl reference is right

  • reloadData or endRefreshing is not called immediately after beginRefreshing, but there is a long time delay (loading data through network), so I am not canceling the beginRefreshing.

Edit : This only happens when the contentOffset property of the tableView is 0 and i call [self.refreshControl beginRefreshing]. Bug? Feauture?

Answer

Peter Lapisu picture Peter Lapisu · Apr 27, 2013

It looks like a bug to me, because it only occures when the contentOffset property of the tableView is 0

I fixed that with the following code (method for the UITableViewController) :

- (void)beginRefreshingTableView {

    [self.refreshControl beginRefreshing];

    if (self.tableView.contentOffset.y == 0) {

        [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^(void){

            self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height);

        } completion:^(BOOL finished){

        }];

    }
}