Comment définir UICollectionViewDelegateFlowLayout?

108

Un UIViewController gère une référence à un UICollectionView. Le contrôleur doit modifier la disposition de flux intégrée à l'aide de UICollectionViewDelegateFlowLayout.

Il est assez facile de définir la source de données de la vue sur soi:

MyViewController.m

- (void)viewDidLoad
{
    self.collectionView.dataSource = self;
}

Mais comment définir le contrôleur pour qu'il soit la disposition de flux délégué de la vue?

- (void)viewDidLoad
{
    self.collectionView.dataSource= self;
    // self.collectionView.??? = self; 
}

J'ai essayé:

- (void)viewDidLoad
{
    self.collectionView.dataSource= self;
    self.collectionView.collectionViewLayout = self; 
}

Mais j'obtiens l'erreur: "Types de pointeurs incompatibles affectant ...".

Le fichier d'en-tête de collection ressemble à ceci:

MyViewController.h

@interface MyViewController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
Rich Apodaca
la source

Réponses:

265

Juste self.collectionView.delegate = self;. Notez que UICollectionViewDelegateFlowLayouthérite de UICollectionViewDelegate.

J'avoue que cela m'a pris au dépourvu au début.

Oh et cela ne fonctionnera que si self.collectionView.collectionViewLayoutest réellement défini sur votre disposition de flux. (ou avec initWithFrame:collectionViewLayout:)

John Estropia
la source
1
@JohnEstropia, désolé pour la question, mais comment initier la mise en page personnalisée dans le code? Je vois des exemples avec des storyboards mais pas avec le code lui-même. Que devrais-je faire?
gaussblurinc
3
probablement self.collectionViewLayout = UICollectionViewFlowLayout(),self.collectionViewLayout = [[UICollectionViewFlowLayout alloc]init]
Daishi Nakajima
14

Selon la réponse précédente, juste un exemple d'utilisation. Ce n'est vraiment pas clair mais je peux montrer comment cela fonctionne:

@interface PrettyViewController()<UICollectionViewDelegateFlowLayout, UICollectionViewDataSource>
    //some code
@end

@implementation PrettyViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.collectionView.delegate = self;//bingo! right here
}

#pragma mark - UICollectionViewDelegateFlowLayout

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section {
    return CGSizeMake([[UIScreen mainScreen] bounds].size.width, 20.0);
}


@end
WINSergey
la source
1

Mes deux cents pour macOS Mojave - Swift

(Je suis tombé ici à la recherche de NSCollectionView... je sais que la question portait sur UICollectionView...)

Tout ce qui est dit ci-dessus (la spécification du délégué implique également la taille de la cellule) est également correcte pour macOS.

REMARQUE : si vous écrivez:

class MyViewController:
    NSCollectionViewDelegate,
    NSCollectionViewDataSource,
    **NSCollectionViewDelegateFlowLayout** 
{

la méthode:

func collectionView(_ collectionView: NSCollectionView, 
                      layout collectionViewLayout: NSCollectionViewLayout, 
               sizeForItemAt indexPath: IndexPath) -> NSSize

sera appelé.

Si elle est supprimée, aucune méthode déléguée ne sera appelée. (car la classe n'obéit pas au protocole).

ingconti
la source