Ich habe eine Antwort von SO Post hier und Dokumente hier
Zunächst können Sie festlegen, dass der Scrollview-Delegat Ihrer Sammlungsansicht Ihre Klasse delegiert, indem Sie Ihre Klasse zu einem Scrollview-Delegaten machen
MyViewController : SuperViewController<... ,UIScrollViewDelegate>
Legen Sie dann Ihren View Controller als Delegaten fest
UIScrollView *scrollView = (UIScrollView *)super.self.collectionView;
scrollView.delegate = self;
Oder tun Sie dies im Interface Builder, indem Sie bei gedrückter Ctrl-Taste + Umschalttaste auf Ihre Sammlungsansicht klicken und dann Strg + Ziehen oder Rechtsklick auf Ihren Ansichts-Controller ziehen und Delegieren auswählen. (Sie sollten wissen, wie das geht). Das geht nicht UICollectionView ist eine Unterklasse von UIScrollView, sodass Sie sie jetzt im Interface Builder durch Drücken von Strg + Umschalt anzeigen können
Implementieren Sie als Nächstes die Delegate-Methode - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
MyViewController.m
...
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
}
In den Dokumenten heißt es:
Parameter
scrollView | Das Objekt in der Bildlaufansicht, das das Bildlauf in der Inhaltsansicht verlangsamt.
Diskussion Die Bildlaufansicht ruft diese Methode auf, wenn die Bildlaufbewegung zum Stillstand kommt. Die Verzögerungseigenschaft von UIScrollView steuert die Verzögerung.
Verfügbarkeit Verfügbar in iOS 2.0 und höher.
Überprüfen Sie dann innerhalb dieser Methode, welche Zelle der Mitte der Bildlaufansicht am nächsten liegt, wenn der Bildlauf beendet wird
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
float visibleCenterPositionOfScrollView = scrollView.contentOffset.x + (self.pictureCollectionView.bounds.size.width / 2);
NSInteger closestCellIndex;
for (id item in imageArray) {
UICollectionViewCell *cell = (UICollectionViewCell *)[self collectionView:self.pictureCollectionView cellForItemAtIndexPath:[NSIndexPath indexPathWithIndex:[imageArray indexOfObject:item]]];
float cellWidth = cell.bounds.size.width;
float cellCenter = cell.frame.origin.x + cellWidth / 2;
float cellSpacing = [self collectionView:self.pictureCollectionView layout:self.pictureCollectionView.collectionViewLayout minimumInteritemSpacingForSectionAtIndex:[imageArray indexOfObject:item]];
if (fabsf(visibleCenterPositionOfScrollView - cellCenter) <= (cellWidth + (cellSpacing / 2))) {
closestCellIndex = [imageArray indexOfObject:item];
break;
}
}
if (closestCellIndex != nil) {
[self.pictureCollectionView scrollToItemAtIndexPath:[NSIndexPath indexPathWithIndex:closestCellIndex] atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:YES];
}