2013-08-30 5 views
9

Sto provando a sviluppare la mia app in Xcode 5 e eseguirne il debug in ambiente iOS 7.Come aggiornare UICollectionViewCell in iOS 7?

Ho un UICollectionViewLayoutAttributes personalizzato.

ho intenzione di fare qualcosa dopo una lunga pressione sul UICollectionViewCell, così ho l'override del metodo in UICollectionViewCell.m

- (void)applyLayoutAttributes:(MyUICollectionViewLayoutAttributes *)layoutAttributes 
{ 
    [super applyLayoutAttributes:layoutAttributes]; 
    if ([(MyUICollectionViewLayoutAttributes *)layoutAttributes isActived]) 
    { 
     [self startShaking]; 
    } 
    else 
    { 
     [self stopShaking]; 
    } 
} 

In iOS 6 o al di sotto, - applyLayoutAttributes: viene chiamato dopo che io chiamo le dichiarazioni qui di seguito .

UICollectionViewLayout *layout = (UICollectionViewLayout *)self.collectionView.collectionViewLayout; 
[layout invalidateLayout]; 

Tuttavia, in iOS 7, - applyLayoutAttributes: non si chiede anche se ricarico il CollectionView.

È un bug che verrà risolto da Apple in un secondo momento o che devo fare qualcosa?

risposta

23

In iOS 7, è necessario eseguire l'override di isEqual: nella sottoclasse UICollectionViewLayoutAttributes per confrontare le proprietà personalizzate che si hanno.

L'implementazione predefinita di isEqual: non confronta le proprietà personalizzate e restituisce sempre SÌ, il che significa che -applyLayoutAttributes: non viene mai chiamato.

Prova questo:

- (BOOL)isEqual:(id)other { 
    if (other == self) { 
      return YES; 
    } 
    if (!other || ![[other class] isEqual:[self class]]) { 
      return NO; 
    } 
    if ([((MyUICollectionViewLayoutAttributes *) other) isActived] != [self isActived]) { 
     return NO; 
    } 

    return YES; 
} 
+6

Risulta avevo bisogno di sostituire l'ultima 'affermativa ritorno con' ritorno [super IsEqual: altro] '. – Cyrille

2

Sì. Come ha affermato Calman, devi eseguire l'override di isEqual: metodo per confrontare le proprietà personalizzate che hai. Vedere la documentazione mela here

Se sottoclasse e implementare tutti gli attributi di layout personalizzato, è necessario anche sovrascrivere l'IsEqual ereditato: metodo per confrontare i valori delle vostre proprietà. In iOS 7 e versioni successive, la vista raccolta non applica gli attributi di layout se tali attributi non sono stati modificati. Determina se gli attributi sono stati modificati confrontando il vecchio e il nuovo oggetto attributo utilizzando il metodo isEqual :. Poiché l'implementazione predefinita di questo metodo controlla solo le proprietà esistenti di questa classe, è necessario implementare la propria versione del metodo per confrontare eventuali proprietà aggiuntive. Se le tue proprietà personalizzate sono tutte uguali, chiama super e restituisci il valore risultante alla fine della tua implementazione.

1

In questo caso, il metodo più efficiente sarebbe

- (BOOL)isEqual:(id)other { 
     if (other == self) { 
      return YES; 
     } 

     if(![super isEqual:other]) { 
      return NO; 
     } 

     return ([((MyUICollectionViewLayoutAttributes *) other) isActived] == [self isActived]); 
}