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;
