72 votes

Extraire pour actualiser dans UICollectionViewController

Je veux mettre en œuvre pull-down-to-refresh en UICollectionViewController sous iOS 6. C'était facile à réaliser avec un UITableViewController, comme suit:

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(startRefresh:)
    forControlEvents:UIControlEventValueChanged];
self.refreshControl = refreshControl;

Le ci-dessus met en œuvre un joli liquide de la goutte d'animation dans le cadre d'un indigène widget.

En tant que UICollectionViewController est un "plus évolué" UITableViewController on pourrait s'attendre à un peu d'une parité de fonctionnalités, mais je ne peux pas trouver une référence de n'importe où à un construit-dans la façon de le mettre en œuvre.

  1. Est-il une manière simple de faire ce que je suis dominant?
  2. Peut - UIRefreshControl être utilisé d'une certaine manière avec UICollectionViewController en dépit de l'en-tête et docs à la fois en indiquant que c'est destiné à être utilisé avec une vue de la table?

215voto

mjh Points 1339

Les réponses à la fois (1) et (2) sont oui.

Il suffit d'ajouter un UIRefreshControl "l'instance d'une sous-vue d' .collectionView et il fonctionne, tout simplement.

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(startRefresh:)
    forControlEvents:UIControlEventValueChanged];
[self.collectionView addSubview:refreshControl];

Ça y est! Je souhaite que cela avait été mentionné dans la documentation quelque part, même si parfois, une simple expérience fait le tour.

EDIT: cette solution ne fonctionnera pas si la collection n'est pas assez grande pour avoir un actif de la barre de défilement. Si vous ajoutez cette déclaration,

self.collectionView.alwaysBounceVertical = YES;

ensuite, tout fonctionne parfaitement. Ce correctif pris à partir d' un autre post sur le même sujet (cité dans un commentaire dans l'autre réponse).

2voto

Log139 Points 2170

La réponse de mjh est correcte.

J'ai rencontré le problème suivant: si le collectionView.contentSize n'était pas plus grand que le collectionView.frame.size , vous ne pouvez pas obtenir le collectionView à faire défiler. Vous ne pouvez pas non plus définir la propriété contentSize (du moins je ne pouvais pas).

S'il ne peut pas faire défiler, il ne vous laissera pas tirer pour actualiser.

Ma solution consistait à sous-classer UICollectionViewFlowLayout et outrepasser la méthode:

 - (CGSize)collectionViewContentSize
{
    CGFloat height = [super collectionViewContentSize].height;

    // Always returns a contentSize larger then frame so it can scroll and UIRefreshControl will work
    if (height < self.collectionView.bounds.size.height) {
        height = self.collectionView.bounds.size.height + 1;
    }

    return CGSizeMake([super collectionViewContentSize].width, height);
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X