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

Я пытаюсь добавить UIRefreshControl в 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

Попробуйте следующее:

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;

Ответ 2

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

enter image description here

Ответ 3

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

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

Swift 3:

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

Ответ 4

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

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

Ответ 5

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

Установив свойство bounces для UICollectionView, решил этот

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

Ответ 6

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