2015-04-16 11 views
6

Ho un UICollectionView in cui ho overrode hitTest: withEvent: nel mio UICollectionViewCells per consentire i tap appena fuori dalle celle di registrarsi come tap sulle celle.Chiama a didHighlightItemAtIndexPath senza una chiamata a didSelectItemAtIndexPath per UICollectionView

Quando faccio questo e tocco appena fuori dalle celle che ora registrano come hit, ricevo chiamate a didHighlightItemAtIndexPath e hoUnhighlightItemAtIndexPath, ma non ottengo una chiamata a didSelectItemAtIndexPath. Se tocco all'interno della cella ottengo tutte le evidenziazioni attese e seleziono le chiamate degli oggetti come facevo prima.

Non ho alcun set di riconoscimento personalizzato di gesture e non sovrascrivo i touchBegan o qualcosa del genere.

Quindi qualcuno sa a quali condizioni si ottiene una chiamata a didHighlightItemAtIndexPath senza una chiamata a didSelectItemAtIndexPath? C'è un modo per ottenere il mio didSelectItemAtIndexPath chiamato? Grazie.

EDIT

Ho dimenticato di dire che il mio UICollectionView si trova a oggi widget, in modo che è contenuto all'interno della vista di scorrimento Centro di notifica. Se sposto il mio codice selezionato in didUnhighlightItemAtIndexPath, viene chiamato quando si tocca all'esterno della cella, ma il risultato è che non è possibile scorrere effettivamente il Centro notifiche senza selezionare una delle celle.

Quindi, forse la differenza tra l'evidenziazione e la selezione che sto vivendo qui ha qualcosa a che fare con il risponditore della vista scroll che cancella la selezione al di fuori della cella?

+1

Invece di eseguire l'override di 'hitTest: withEvent:', provare a sovrascrivere ['pointInside: withEvent:'] (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/index.html# // apple_ref/OCC/INSTM/UIView/pointInside: withEvent :). Funziona meglio? L'implementazione predefinita di 'hitTest: withEvent:' usa 'pointInside: withEvent:', ma forse 'UICollectionView' usa anche' pointInside: withEvent: 'direttamente. –

+0

In realtà avevo overridden pointInside: withEvent: anche per implementarlo. Viene sempre e solo chiamato da hitTest: withEvent :. –

risposta

1

OK, ho capito cosa stava succedendo.

Ho aggiunto un nuovo UITapGestureRecognizer al mio UICollectionView. L'implementazione in questo modo mi ha portato la soluzione:

- (void)cellSingleTap:(UITapGestureRecognizer *)sender 
{ 
    CGPoint point = [sender locationInView:collectionView_]; 
    NSIndexPath *indexPath = [collectionView_ indexPathForItemAtPoint:point]; 
    [ .... ] 
} 

Quando ho controllato i punti restituiti quando ho ottenuto mettendo in evidenza, ma nessuna selezione, è emerso che è successo quando il punto premuto su era entro i inserti sezione della collezione visualizza il layout. E quando i tocchi erano presenti nelle sezioni della sezione, le chiamate indexPathForItemAtPoint restituivano nil.

Quindi, in sostanza, la vista della raccolta evidenzierà, ma non selezionerà, i tocchi che si trovano all'esterno delle celle ma che si trovano all'interno delle sezioni della sezione. Finché i tocchi sono al di fuori delle celle e non all'interno dei riquadri, quei tocchi comporteranno chiamate a didSelectItemAtIndexPath.

Poiché vorrei che i tocchi all'interno degli inserti contassero come tocchi sulle celle, sono stato in grado di risolvere questo problema regolando i punti di tocco prima della chiamata a indexPathForItemAtPoint.