UIRefreshControl su UICollectionView funziona solo se la raccolta riempie l'altezza del contenitore


142

Sto cercando di aggiungere a UIRefreshControla UICollectionView, ma il problema è che il controllo di aggiornamento non viene visualizzato a meno che la vista della raccolta non riempia l'altezza del contenitore principale. In altre parole, a meno che la vista della raccolta non sia abbastanza lunga da richiedere lo scorrimento, non può essere trascinata verso il basso per rivelare la vista del controllo di aggiornamento. Non appena la raccolta supera l'altezza del contenitore principale, viene tirata giù e rivela la vista di aggiornamento.

Ho impostato un progetto iOS rapido con solo una vista UICollectionViewinterna, con uno sbocco alla vista raccolta in modo da poter aggiungere UIRefreshControlad esso viewDidLoad. Esiste anche una cella prototipo con l'identificatore di riutilizzocCell

Questo è tutto il codice nel controller e dimostra abbastanza bene il problema. In questo codice ho impostato l'altezza della cella su 100, che non è sufficiente per riempire il display, quindi la vista non può essere estratta e il controllo di aggiornamento non mostrerà. Impostalo su qualcosa di più alto per riempire il display, quindi funziona. Qualche idea?

@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
UsaalwaysBounceVertical
onmyway133

Risposte:


395

Prova questo:

self.collectionView.alwaysBounceVertical = YES;

Codice completo per a 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
Fantastica, quella riga è la soluzione esatta, il resto del codice non ha importanza. Non è un brutto inizio per te su StackOverflow! Saluti!
Merott,

7
Sì, nessun problema. È ovvio che sono un principiante eh. Comunque risulta che ero bloccato nella stessa situazione quando ho visto il tuo post. Quando ho trovato la soluzione, ho pensato di condividerla. Saluti
Larry

6
Bene, Juan, probabilmente hai già trovato la risposta alla tua domanda. Ma, al fine di riportare il controllo di aggiornamento al suo stato normale dopo un aggiornamento, è necessario chiamare [refreshControl endRefreshing].
Merott,

2
Questo purtroppo non è più supportato. UIRefreshControl può essere utilizzato solo con UITableViewController e ora è rigorosamente applicato.
Luke Van L'

3
In iOS 10, UIScrollView(una superview di UICollectionView) refreshControlora ha una proprietà developer.apple.com/videos/play/wwdc2016/219/?time=2033
Streeter,

29

Attributi / Scorri vista / Rimbalza verticalmente in Storyboard / Xib

inserisci qui la descrizione dell'immagine


23

La risposta di Larry in fretta:

    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

Const dà un errore di variabile non definita. se qualcuno incontra la stessa situazione, basta sostituirla con UIColor.whiteColor()o con qualsiasi colore ti piaccia.
Faisal,

1
Anche per l'uso di Swift 2.2action: #selector(self.refresh)
Faisal

1

Se il tuo collectionviewcontenuto ha dimensioni sufficientemente grandi da scorrere verticalmente, va bene, ma nel tuo caso non lo è.

È necessario abilitare la proprietà AlwaysBounceVertical, in modo da poter impostareself.collectionView.alwaysBounceVertical = YES;


0

Anch'io stavo affrontando lo stesso problema, non ero in grado di utilizzare il UIRefreshControlfino alUICollectionView dimensioni del contenuto non erano abbastanza grandi da scorrere verticalmente,

Impostare la bouncesproprietà di UICollectionViewrisolto questo

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

0

Sto chiamando beginRefreshing()subito dopo viewDidLoad(), ma su alcuni schermi non funziona. E solo collectionView.layoutIfNeeded()in viewDidLoad()mi ha aiutato


0

È necessario verificare nella chiamata API se la vista raccolta è in stato di aggiornamento, quindi terminare l'aggiornamento per chiudere il controllo di aggiornamento.

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()
}

Da notare che il rimbalzo su scroll è abilitato nel mio file storyboard.
Asad Jamil,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.