UICollectionViewLayout layoutAttributesForElementsInRect y layoutAttributesForItemAtIndexPath

Estoy implementando un layout de flujo personalizado. Tiene 2 methods principales para anular para determinar la location de celdas: layoutAttributesForElementsInRect y layoutAttributesForItemAtIndexPath .

En mi código, se llama a layoutAttributesForItemAtIndexPath , pero layoutAttributesForItemAtIndexPath no lo es. ¿Qué determina qué se llama? ¿ layoutAttributesForItemAtIndexPath se llama a layoutAttributesForItemAtIndexPath ?

layoutAttributesForElementsInRect: no necesariamente llama a layoutAttributesForItemAtIndexPath:

De hecho, si subclass UICollectionViewFlowLayout , el layout del flujo preparará el layout y almacenará en caching los attributes resultantes. Por lo tanto, cuando se layoutAttributesForElementsInRect: no solicitará layoutAttributesForItemAtIndexPath: sino que simplemente usa los valores almacenados en caching.

Si desea asegurarse de que los attributes de layout siempre se modifiquen de acuerdo con su layout, implemente un modificador para layoutAttributesForElementsInRect: y layoutAttributesForItemAtIndexPath: ::

 - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { NSArray *attributesInRect = [super layoutAttributesForElementsInRect:rect]; for (UICollectionViewLayoutAttributes *cellAttributes in attributesInRect) { [self modifyLayoutAttributes:cellAttributes]; } return attributesInRect; } - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewLayoutAttributes *attributes = [super layoutAttributesForItemAtIndexPath:indexPath]; [self modifyLayoutAttributes:attributes]; return attributes; } - (void)modifyLayoutAttributes:(UICollectionViewLayoutAttributes *)attributes { // Adjust the standard properties size, center, transform etc. // Or subclass UICollectionViewLayoutAttributes and add additional attributes. // Note, that a subclass will require you to override copyWithZone and isEqual. // And you'll need to tell your layout to use your subclass in +(Class)layoutAttributesClass }