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


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

Я настроил быстрый проект iOS с помощью всего лишь UICollectionView внутри основного вида, с выходом на вид коллекции, так что я могу добавить UIRefreshControlк нему в viewDidLoad. Существует также ячейка-прототип с идентификатором "reuse"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);
}
5 135

5 ответов:

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

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;

атрибуты / вид прокрутки / отскок по вертикали в раскадровке / Xib

enter image description here

ответ Ларри в swift:

    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

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

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

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

задание bounces собственность UICollectionView решил эту

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