2015-04-16 12 views
6

Ich habe eine UICollectionView, in der ich hitTest: withEvent: in meinen UICollectionViewCells überschreibe, damit Taps direkt außerhalb der Zellen als Taps auf die Zellen registriert werden.Aufruf von didHighlightItemAtIndexPath ohne Aufruf von didSelectItemAtIndexPath für UICollectionView

Wenn ich dies tue und tippe gerade außerhalb der Zellen, die sich jetzt als Treffer registrieren, bekomme ich Aufrufe von didHighlightItemAtIndexPath und didUnhighlightItemAtIndexPath, aber ich bekomme keinen Aufruf von didSelectItemAtIndexPath. Wenn ich in die Zelle klicke, erhalte ich alle erwarteten Hervorhebungen und wähle Objektaufrufe wie zuvor.

Ich habe keine benutzerdefinierten Gestenerkennung eingerichtet und ich übergehe nicht TouchseBegan oder ähnliches.

Also weiß jemand unter welchen Bedingungen Sie einen Aufruf für didHighlightItemAtIndexPath ohne einen Aufruf von didSelectItemAtIndexPath erhalten? Gibt es eine Möglichkeit, meinen didSelectItemAtIndexPath aufzurufen? Vielen Dank.

EDIT

habe ich vergessen zu erwähnen, dass mein UICollectionView innerhalb eines Heute Widget ist, so ist es in der Notification Center Scroll-Ansicht enthalten. Wenn ich meinen Auswahlcode in didUnhighlightItemAtIndexPath verschiebe, wird er aufgerufen, wenn Sie außerhalb der Zelle tippen. Das Ergebnis ist jedoch, dass Sie nicht durch die Benachrichtigungszentrale blättern können, ohne eine der Zellen auszuwählen.

Also hat der Unterschied zwischen der Hervorhebung und der Auswahl, die ich hier erlebe, etwas damit zu tun, dass der Responder der Bildansicht die Auswahl außerhalb der Zelle aufhebt?

+1

Anstatt "hitTest: withEvent:" zu überschreiben, überschreiben Sie ['pointInside: withEvent:'] (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/index.html# // apple_ref/occ/instm/UIView/pointInside: withEvent :). Funktioniert das besser? Die Standardimplementierung von 'hitTest: withEvent:' verwendet 'pointInside: withEvent:', aber vielleicht verwendet 'UICollectionView' auch' pointinside: withEvent: 'direkt. –

+0

Ich hatte tatsächlich PointInside überschrieben: withEvent: als auch dies zu implementieren. Es wird immer nur von hitTest aufgerufen: withEvent :. –

Antwort

1

OK, ich habe herausgefunden, was los ist.

Ich habe einen neuen UITapGestureRecognizer zu meiner UICollectionView hinzugefügt. Die Umsetzung es so führte mir die die Lösung:

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

Wenn überprüfte ich die zurückgegebenen Punkte, wenn ich hervorheben bekam aber keine Auswahl, es wurde deutlich, dass es geschah, als der Punkt klopfte in dem Abschnitt Einsätze der Sammlung war Layout ansehen Und wenn die Taps auf den Abschnittseinfügungen waren, gaben die Aufrufe von indexPathForItemAtPoint nil zurück.

Im Grunde wird die Sammlung Ansicht markieren, aber nicht auswählen, Taps, die außerhalb der Zellen sind, aber sind innerhalb seiner Abschnitt eingefügt. Solange sich die Abgriffe außerhalb der Zellen und nicht innerhalb der Einschübe befinden, führen diese Abgriffe zu Aufrufen von didSelectItemAtIndexPath.

Da ich möchte, dass Taps innerhalb der Einschübe als Taps auf Zellen zählen, konnte ich dieses Problem umgehen, indem ich die Antipppunkte vor meinem Aufruf von indexPathForItemAtPoint änderte.