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
можно было бы ожидать некоторого паритета функций, но я не могу найти ссылку на встроенный способ реализации этого.
- есть ли простой способ сделать это, что я с видом?
- можете
UIRefreshControl
использовать как-то сUICollectionViewController
несмотря на заголовок и документы, в которых говорится, что он должен использоваться с табличным представлением?
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
делает работу за меня.
ответ 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;