UIRefreshControl для UICollectionView работает, только если коллекция заполняет высоту контейнера


142

Я пытаюсь добавить UIRefreshControlк a UICollectionView, но проблема в том, что элемент управления обновлением не появляется, если представление коллекции не заполняет высоту своего родительского контейнера. Другими словами, если представление коллекции не достаточно длинное, чтобы требовать прокрутки, его нельзя развернуть, чтобы открыть представление управления обновлением. Как только коллекция превышает высоту своего родительского контейнера, она опускается и открывает представление обновления.

Я настроил быстрый проект iOS с UICollectionViewосновным внутренним представлением, с выходом в представление коллекции, чтобы я мог добавить UIRefreshControlего в viewDidLoad. Существует также прототип ячейки с идентификатором повторного использованияcCell

Это весь код контроллера, и он довольно хорошо демонстрирует проблему. В этом коде я установил высоту ячейки равной 100, что недостаточно для заполнения экрана, и поэтому вид не может быть извлечен, и элемент управления обновлением не будет отображаться. Установите его на что-то выше, чтобы заполнить дисплей, тогда он работает. Любые идеи?

@interface ViewController () <UICollectionViewDelegateFlowLayout, UICollectionViewDataSource>
@property (strong, nonatomic) IBOutlet UICollectionView *collectionView;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
    [self.collectionView addSubview:refreshControl];
}

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return 1;
}

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return 1;
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    return [collectionView dequeueReusableCellWithReuseIdentifier:@"cCell" forIndexPath:indexPath];
}

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return CGSizeMake(self.view.frame.size.width, 100);
}


1
ИспользованиеalwaysBounceVertical
onmyway133

Ответы:


395

Попробуй это:

self.collectionView.alwaysBounceVertical = YES;

Полный код для UIRefreshControl

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
refreshControl.tintColor = [UIColor grayColor];
[refreshControl addTarget:self action:@selector(refershControlAction) forControlEvents:UIControlEventValueChanged];
[self.collectionView addSubview:refreshControl];
self.collectionView.alwaysBounceVertical = YES;

1
Удивительно, эта строка - точное исправление, остальная часть кода не имеет значения. Неплохое начало для вас на StackOverflow! Ура!
Меротт

7
Да нет проблем. Это так очевидно, что я новичок, да. Во всяком случае, оказывается, что я застрял в той же ситуации, когда я увидел ваш пост. Когда я нашел решение, я определенно должен был поделиться им. Приветствия
Ларри

6
Ну, Хуан, вы, наверное, уже нашли ответ на свой вопрос. Но, чтобы вернуть элемент управления обновлением в нормальное состояние после обновления, необходимо вызвать [refreshControl endRefreshing].
Меротт

2
К сожалению, это больше не поддерживается. UIRefreshControl может использоваться только с UITableViewController, и теперь он строго соблюдается.
Люк Ван В

3
В iOS 10 UIScrollView(суперпредставление UICollectionView) теперь есть refreshControlсвойство developer.apple.com/videos/play/wwdc2016/219/?time=2033
Streeter

29

Атрибуты / Вид прокрутки / Отскок вертикально в раскадровке / Xib

введите описание изображения здесь


23

Ларри быстро отвечает:

    let refreshControl = UIRefreshControl()
    refreshControl.tintColor = UIColor.blueColor()
    refreshControl.addTarget(self, action: "refresh", forControlEvents: .ValueChanged)
    collectionView.addSubview(refreshControl)
    collectionView.alwaysBounceVertical = true

Свифт 3:

    let refreshControl = UIRefreshControl()
    refreshControl.tintColor = .blue
    refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
    collectionView.addSubview(refreshControl)
    collectionView.alwaysBounceVertical = true

Const выдает ошибку неопределенной переменной. если кто-то сталкивается с такой же ситуацией, просто замените его UIColor.whiteColor()или любой другой цвет, который вам нравится.
Фейсал

1
Также для использования Swift 2.2action: #selector(self.refresh)
Faisal

1

Если у вас collectionviewдостаточно большой размер контента для вертикальной прокрутки, это нормально, но в вашем случае это не так.

Вы должны включить свойство AlwaysBounceVertical, чтобы вы могли установитьself.collectionView.alwaysBounceVertical = YES;


0

Я тоже столкнулся с той же проблемой, я не мог использовать, UIRefreshControlпока UICollectionViewразмер содержимого не был достаточно большим для прокрутки по вертикали,

Установка bouncesсвойства UICollectionViewрешена этим

[self.collectionView setBounces:YES];
[self.collectionView setAlwaysBounceVertical:YES];

0

Я звоню beginRefreshing()сразу после этого viewDidLoad(), но на некоторых экранах это не работает. И только collectionView.layoutIfNeeded()в viewDidLoad()помощь мне


0

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

private let refreshControl = UIRefreshControl()
 refreshControl.tintColor = .white
 refreshControl.addTarget(self, action: #selector(refreshData), for: .valueChanged)
 collectionView.addSubview(refreshControl)
 @objc func refreshData() {
    // API Call
 }
// Disable refresh control if already refreshing 
if refreshControl.isRefreshing {
    refreshControl.endRefreshing()
}

Чтобы быть отмеченным, отскок при прокрутке включен в моем файле раскадровки.
Асад Джамиль
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.