11

Sto implementando un layout di flusso personalizzato. Dispone di 2 metodi principali per eseguire l'override per determinare il posizionamento delle celle: layoutAttributesForElementsInRect e layoutAttributesForItemAtIndexPath.UICollectionViewLayout layoutAttributesForElementsInRect e layoutAttributesForItemAtIndexPath

Nel mio codice, layoutAttributesForElementsInRect viene chiamato, ma non lo è layoutAttributesForItemAtIndexPath. Cosa determina chi viene chiamato? Da dove viene chiamato layoutAttributesForItemAtIndexPath?

risposta

14

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 
} 
+0

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

+3

Un 'UICollectionViewLayoutAttributes' ha la proprietà' indexPath'. – Robert

+0

@Robert Non restituisce nulla [super layoutAttributesForElementsInRect]? Questa è l'impressione che ho ricevuto dai documenti APple. – moonman239