Ich werde eine andere Lösung hinzufügen. Das Einrasten ist nicht perfekt (nicht so gut wie wenn Paging aktiviert ist, funktioniert aber gut genug).
Ich habe versucht, Soroush-Lösung zu implementieren, aber es funktioniert nicht für mich.
Da die UICollectionView
eine Unterklasse von UIScrollView
ist es zu einem wichtigen UIScrollViewDelegate
Verfahren reagiert das ist:
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
withVelocity:(CGPoint)velocity
targetContentOffset:(inout CGPoint *)targetContentOffset
Die targetContentOffset
(ein inout Zeiger) können Sie den Haltepunkt für eine Sammlung Ansicht neu definieren (die x
in diesem Fall, wenn Sie horizontal wischen).
Eine kurze Notiz über ein paar der folgenden Variablen gefunden:
self.cellWidth
- das ist Ihre Sammlung Breite Sichtzelle (man kann es auch dort hart codieren, wenn Sie wollen)
self.minimumLineSpacing
- das ist der minimale Zeilenabstand, den Sie zwischen den Zellen setzen
self.scrollingObjects
ist das Array von Objekten in der Sammlung enthalten (ich brauche dies vor allem für die zählen, zu wissen, wann Scrollen zu stoppen)
So ist die Idee, diese Methode in der Sammlung Ansicht der Delegierten zu implementieren, etwa so:
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
withVelocity:(CGPoint)velocity
targetContentOffset:(inout CGPoint *)targetContentOffset
{
if (self.currentIndex == 0 && velocity.x < 0) {
// we have reached the first user and we're trying to go back
return;
}
if (self.currentIndex == (self.scrollingObjects.count - 1) && velocity.x > 0) {
// we have reached the last user and we're trying to go forward
return;
}
if (velocity.x < 0) {
// swiping from left to right (going left; going back)
self.currentIndex--;
} else {
// swiping from right to left (going right; going forward)
self.currentIndex++;
}
float xPositionToStop = 0;
if (self.currentIndex == 0) {
// first row
xPositionToStop = 0;
} else {
// one of the next ones
xPositionToStop = self.currentIndex * self.cellWidth + (self.currentIndex + 1) * self.minimumLineSpacing - ((scrollView.bounds.size.width - 2*self.minimumLineSpacing - self.cellWidth)/2);
}
targetContentOffset->x = xPositionToStop;
NSLog(@"Point of stopping: %@", NSStringFromCGPoint(*targetContentOffset));
}
Wir freuen uns auf jedes Feedback Sie haben die macht das Einrasten besser.Ich halte auch für eine bessere Lösung auf der Suche ...
Dies ist jedoch nicht passieren wählen und tippen Ereignisse korrekt bis zur darunter liegenden Sammlung Ansicht ab iOS7. Irgendwelche Ideen? – eanticev
Auf iOS7 (zumindest war das vorher wahrscheinlich) benötigen Sie den Scrollview nicht. Ermitteln Sie einfach die linke und rechte Gestenbewegung und verwenden Sie diese, um den Versatz Ihrer Sammlungsansicht 1 Seite vorwärts/rückwärts einzustellen. – buildsucceeded
Ich kann nicht für das Leben von mir es auf iOS7 arbeiten. 'scrollViewDidScroll' einer" geheimen "Scroll-Ansicht wird niemals zugestellt. –