web-dev-qa-db-fra.com

Comment définir UICollectionViewDelegateFlowLayout?

UIViewController maintient une référence à UICollectionView. Le contrôleur doit modifier la structure 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 elle-même:

MyViewController.m

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

Mais comment définir le contrôleur pour qu'il soit la disposition de flux de délégués 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 suivante: "Types de pointeurs incompatibles affectant ...".

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

MyViewController.h

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

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

J'admets qu'il peut vous prendre au dépourvu au début.

Oh et ça ne marchera que si self.collectionView.collectionViewLayout est actuellement défini sur votre structure de flux. (ou réglé avec initWithFrame:collectionViewLayout:)

228
John Estropia

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
11
WINSergey

mes deux cents pour OSX Mojave - Swift

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

Tout ce qui précède (spécifier un délégué implique également la taille de la cellule) est également correct pour OSX.

[~ # ~] notez [~ # ~] si vous écrivez:

classe MyViewController: NSCollectionViewDelegate, NSCollectionViewDataSource, NSCollectionViewDelegateFlowLayout {

la méthode:

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

sera être appelé.

SI enlevé, aucune méthode déléguée ne sera appelée. (comme la classe n'obéit pas au protocole).

0
ingconti