UIRefreshControl на UICollectionView працює лише у тому випадку, якщо колекція заповнює висоту контейнера


142

Я намагаюся додати 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);
}

побачити це прошивка 10 stackoverflow.com/questions/19483511 / ...
Аніш Parajuli 웃

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 call, чи перегляд колекції знаходиться в освіжаючому стані, а потім закінчити оновлення, щоб відхилити оновлення.

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.