UICollectionView: Comment obtenir la taille d'un article pour un élément spécifique après l'avoir défini en mode délégué
Je suis à jouer avec les nouveaux UICollectionView et la UICollectionViewLayout classes. J'ai créé une mise en page personnalisée, sous-classement UICollectionViewFlowLayout.
Mes tailles de cellule sont en train de changer de façon dynamique, et j'ai mis les tailles des éléments à l'aide de la méthode du délégué ci-dessous
- (CGSize)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout*)collectionViewLayout
sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"SETTING SIZE FOR ITEM AT INDEX %d", indexPath.row);
return CGSizeMake(80, 80);
}
Maintenant, en vertu de la prepareLayout méthode de ma coutume UICollectionViewFlowLayout classe, j'ai besoin d'accéder à ces taille variables pour que je puisse faire les calculs de la façon de les placer et de les mettre en cache pour layoutAttributesForItemAtIndexPath.
Cependant, je n'arrive pas à trouver les biens en vertu de UICollectionView ou UICollectionViewFlowLayout pour atteindre l'élément personnalisé tailles j'ai défini dans la méthode du délégué.
source d'informationauteur SarpErdag
Vous devez vous connecter pour publier un commentaire.
Trouvé moi-même.
En œuvre de la classe personnalisée, comme sans omettre
UICollectionViewDelegateFlowLayout
et puis vous pouvez appeler
Regardant les différentes
UICollectionView...
fichiers d'en-tête, et en regardant le WWDC 2012 Session 219 - Avancées de Collecte de points de Vue et construire des Mises en page Personnalisées vidéo (à partir de 6:50 et suivantes), il semble que le extensible modèle de délégué prend avantage de typage dynamique pour assurer la mise en page peut accéder correctement son étendue délégué méthodes.En bref...
UI(Collection)ViewController
qui gère l'affichage de la collection), de déclarer lui-même à l'appui de ce protocole personnalisé.UICollectionViewFlowLayout
ou sous-classe de celle-ci, cela signifie simplement déclarer la conformité auxUICollectionViewDelegateFlowLayout
..m
fichier si vous préférez ne pas#import
la mise en page d'en-tête dans le délégué de l'interface.collectionView
de la propriété, et cast le délégué à un objet conforme au protocole requis à convaincre le compilateur.respondsToSelector:
comme d'habitude avant d'appeler facultatif délégué méthodes. En fait, si vous voulez, il n'y a pas de mal à faire cela pour toutes les méthodes, comme la typecasting n'y a pas d'exécution de garantir le délégué à même de mettre en œuvre les méthodes requises.Dans le code...
Donc, si vous mettez en œuvre une mise en page personnalisée qui nécessite un délégué pour certains de ses renseignements, votre en-tête pourrait ressembler à quelque chose comme ceci:
Votre délégué déclare la conformité (je l'ai fait dans le fichier d'implémentation ici):
Et de la mise en page de l'application, vous accédez à la méthode comme ceci:
Noter qu'il est sûr de transtypage ici, comme nous allons vérifier le délégué répond à cette méthode à l'avance de toute façon.
La preuve...
C'est que la spéculation, mais je soupçonne que c'est la façon dont Apple gère le
UICollectionViewDelegateFlowLayout
protocole.delegate
bien sur la disposition de flux, de sorte que les appels doivent passer par l'affichage de la collection du délégué.UICollectionViewController
n'ont pas accepté de se conformer à l'étendue disposition de flux délégué (et je doute qu'il le fait dans un autre privé d'en-tête).UICollectionView
'sdelegate
propriété ne déclare la conformité à la 'base'UICollectionViewDelegate
protocole. Encore une fois, je doute qu'il y est un privé sous-classe/catégorie deUICollectionView
en cours d'utilisation par la disposition de flux pour éviter que l'typecasting. Pour ajouter plus de poids à ce point, Apple décourage sous-classementUICollectionView
à tous dans les docs (Vue de Collection le Guide de Programmation pour iOS: Créer des Mises en page Personnalisées):Alors nous en aller. Pas compliqué, mais faut savoir comment le faire paradigme de manière conviviale.
Il y a une swift version:
Découvrez UICollectionView-FlowLayout sur GitHub. Même idée, cela fait juste accéder à l'étendue délégué méthodes de flowLayout un peu plus propre.
Pour la plus tard lecteurs, IOS 7 a UICollectionViewFlowLayout qui l'a défini.
Dans mon cas tout au sujet de la présentation, de la cellule de mise en page etc. est définie à l'intérieur de la plume UIViewController et séparer la plume UICollectionViewCell.
MyCollectionViewCell
contientUIImageView
avec mise en page automatique de la cellule avec un rembourrage/marges, mais en forme de carré.J'ai besoin d'icônes rondes au lieu au carré mais ne veulent pas prendre soin de plume que j'utilise pour iPhone ou pour iPad (je n'ai séparé des plumes pour les appareils et pour l'orientation).
Je ne veux pas mettre en œuvre
@selector(collectionView:layout:sizeForItemAtIndexPath:)
dans mon point de vue contrôleur.Ainsi, à l'intérieur
collectionView:cellForItemAtIndexPath:
Je peux utiliser
Parce que
collectionView:layout:sizeForItemAtIndexPath:
appeler avant decollectionView:cellForItemAtIndexPath:
et la mise en page fait.Vous pouvez vérifier la ronde des avatars sur le fond