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()
помог мне