Pull-To-refresh в UICollectionViewController


Я хочу реализовать pull-down-to-refresh в UICollectionViewController под iOS 6. Это было легко достичь с помощью UITableViewController, например:

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(startRefresh:)
    forControlEvents:UIControlEventValueChanged];
self.refreshControl = refreshControl;

выше реализована хорошая анимация капель жидкости как часть собственного виджета.

как UICollectionViewController это "более развитый" UITableViewController можно было бы ожидать некоторого паритета функций, но я не могу найти ссылку на встроенный способ реализации этого.

  1. есть ли простой способ сделать это, что я с видом?
  2. можете UIRefreshControl использовать как-то с UICollectionViewController несмотря на заголовок и документы, в которых говорится, что он должен использоваться с табличным представлением?
5 73

5 ответов:

ответы на оба (1) и (2) да.

добавить UIRefreshControl экземпляр как подвида .collectionView и это просто работает.

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(startRefresh:)
    forControlEvents:UIControlEventValueChanged];
[self.collectionView addSubview:refreshControl];

вот именно! Я хотел бы, чтобы это было упомянуто в документации где-то, хотя иногда простой эксперимент делает трюк.

EDIT: это решение не будет работать, если коллекция не достаточно велика, чтобы иметь активную полосу прокрутки. Если вы добавите это утверждение,

self.collectionView.alwaysBounceVertical = YES;

тогда все работает отлично. Это исправление взято из следующий пост на ту же тему (ссылка в комментарии в другом опубликованном ответе).

Я искал то же самое решение, но в Swift. Основываясь на приведенном выше ответе, я сделал следующее:

let refreshCtrl = UIRefreshControl()
    ...
refreshCtrl.addTarget(self, action: "startRefresh", forControlEvents: .ValueChanged)
collectionView?.addSubview(refreshCtrl)

не забывая при этом:

refreshCtrl.endRefreshing()

Я использовал раскадровку и настройки self.collectionView.alwaysBounceVertical = YES; не работает. Выбор Bounces и Bounces Vertically делает работу за меня.

enter image description here

ответ mjh правильный.

я столкнулся с проблемой, где еслиcollectionView.contentSize не больше, чем collectionView.frame.size, вы не можете получить collectionView для прокрутки. Вы не можете установить contentSize свойство (по крайней мере я не смог).

если он не может прокручивать, он не позволит вам сделать тянуть, чтобы обновить.

мое решение было подкласса UICollectionViewFlowLayout и переопределению метода:

- (CGSize)collectionViewContentSize
{
    CGFloat height = [super collectionViewContentSize].height;

    // Always returns a contentSize larger then frame so it can scroll and UIRefreshControl will work
    if (height < self.collectionView.bounds.size.height) {
        height = self.collectionView.bounds.size.height + 1;
    }

    return CGSizeMake([super collectionViewContentSize].width, height);
}

The refreshControl свойство теперь добавлено в UIScrollView начиная с iOS 10, поэтому вы можете установить элемент управления обновлением непосредственно в представлениях коллекции.

https://developer.apple.com/reference/uikit/uiscrollview/2127691-refreshcontrol

UIRefreshControl *refreshControl = [UIRefreshControl new];
[refreshControl addTarget:self action:@selector(refreshControlAction:) forControlEvents:UIControlEventValueChanged];
self.collectionView.refreshControl = refreshControl;