layoutAttributesForElementsInRect:
non chiama necessariamente layoutAttributesForItemAtIndexPath:
.
In effetti, se si sottoclasse UICollectionViewFlowLayout
, il layout del flusso preparerà il layout e memorizzerà nella cache gli attributi risultanti. Quindi, quando viene chiamato layoutAttributesForElementsInRect:
, non chiederà layoutAttributesForItemAtIndexPath:
, ma utilizza solo i valori memorizzati nella cache.
Se si vuole garantire che gli attributi di layout sono sempre modificati in base al layout, implementare un modificatore sia per layoutAttributesForElementsInRect:
e 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
}
Cosa succede se ho bisogno del percorso dell'indice per determinare la proprietà rect del attributo? Non ho modo di passare il percorso dell'indice nella funzione di modifica. – sudo
Un 'UICollectionViewLayoutAttributes' ha la proprietà' indexPath'. – Robert
@Robert Non restituisce nulla [super layoutAttributesForElementsInRect]? Questa è l'impressione che ho ricevuto dai documenti APple. – moonman239