118 votes

Comment définir UICollectionViewDelegateFlowLayout ?

Un UIViewController maintient une référence à un UICollectionView. Le contrôleur doit modifier la disposition de flux intégrée en utilisant le UICollectionViewDelegateFlowLayout.

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

MyViewController.m

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

Mais comment faire pour que le contrôleur soit le délégué de la mise en page du flux 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 je reçois l'erreur : "Types de pointeurs incompatibles assignant ...".

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

MyViewController.h

@interface MyViewController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>

286voto

John Estropia Points 6718

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

J'admets que ça m'a pris au dépourvu au début.

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

15voto

WINSergey Points 95

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

1voto

ingconti Points 405

Mes deux centimes pour macOS Mojave - Swift

(Je suis tombé ici en cherchant NSCollectionView ... Je sais que la question portait sur UICollectionView ..)

Tout ce qui a été dit ci-dessus (spécifier le délégué implique également la taille de la cellule) est correct pour macOS également.

NOTE : Si vous écrivez :

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

la méthode :

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

sera être appelé.

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

0voto

keshav Points 45

Si vous voulez l'utiliser dans swift utilisez simplement ceci

UICollectionViewDelegateFlowLayout dans le délégué de votre contrôleur ou faites une extension de votre contrôleur pour cela ; après cela, ajoutez ceci

func collectionView(_ collectionView : UICollectionView, layout collectionViewLayout : UICollectionViewLayout, sizeForItemAt indexPath : IndexPath) -> CGSize { return CGSize(width : (collectionView.frame.size.width - 10) / 2, height : (collectionView.frame.size.width - 10) / 2) }

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