How to programmatically scroll through a collection view?
There are two methods that could help you achieve this:
func scrollToItemAtIndexPath(indexPath: NSIndexPath,
atScrollPosition scrollPosition: UICollectionViewScrollPosition,
animated animated: Bool)
or
func setContentOffset(contentOffset: CGPoint,
animated animated: Bool)
Both are on UICollectionView
so you can use whatever seems more convenient. To create a custom animation for this however is more difficult. A quick solution depending on what you need could be this answer.
Swift 4, iOS 11:
// UICollectionView method
func scrollToItem(at indexPath: IndexPath,
at scrollPosition: UICollectionViewScrollPosition,
animated: Bool)
// UIScrollView method
func setContentOffset(_ contentOffset: CGPoint, animated: Bool)
How to scroll UICollectionViewCell programmatically in IOS?
Assuming your collectionView contains only 1 section, and given that each item occupies the whole frame then you could do something like this;
NSArray *visibleItems = [self.collectionView indexPathsForVisibleItems];
NSIndexPath *currentItem = [visibleItems objectAtIndex:0];
NSIndexPath *nextItem = [NSIndexPath indexPathForItem:currentItem.item + 1 inSection:currentItem.section];
[self.collectionView scrollToItemAtIndexPath:nextItem atScrollPosition:UICollectionViewScrollPositionTop animated:YES];
Programmatically scroll to a supplementary view within UICollectionView
You can not use scrollToItemAtIndexPath:atScrollPosition:animated
for this.
Hopefully, they will add a new method like scrollToSupplementaryElementOfKind:atIndexPath:
in the future, but for now, the only way is to manipulate the contentOffset directly.
The code below shows how to scroll header to be on top vertically with FlowLayout. You can do the same for horizontal scrolling, or use this idea for other layout types.
NSIndexPath *indexPath = ... // indexPath of your header, item must be 0
CGFloat offsetY = [collectionView layoutAttributesForSupplementaryElementOfKind:UICollectionElementKindSectionHeader atIndexPath:indexPath].frame.origin.y;
CGFloat contentInsetY = self.contentInset.top;
CGFloat sectionInsetY = ((UICollectionViewFlowLayout *)collectionView.collectionViewLayout).sectionInset.top;
[collectionView setContentOffset:CGPointMake(collectionView.contentOffset.x, offsetY - contentInsetY - sectionInsetY) animated:YES];
Note that if you have non-zero contentInset
(as in iOS 7, when scroll views expand below bars) you need to subtract it from the offsetY
, as shown. Same for sectionInset
.
Update:
The code assumes that the layout is in prepared, "valid" state because it uses it to calculate the offset. The layout is prepared when the collection view presents its content.
The call to [_collectionView.collectionViewLayout prepareLayout]
before the code above may help when you need to scroll the collection view which is not yet presented (from viewDidLoad
say). The call to layoutIfNeeded
(as @Vrasidas suggested in comments) should work too because it also prepares the layout.
How to scroll to a particluar index in collection view in swift
In viewDidLoad
of your controller, you can write the code for scrolling to a particular index path of collection view.
self.collectionView.scrollToItem(at:IndexPath(item: indexNumber, section: sectionNumber), at: .right, animated: false)
Related Topics
How to Create Custom Calendar in React Native
Programmatically Get Own Phone Number in Ios
Can You Animate a Height Change on a Uitableviewcell When Selected
Figure Out Size of Uilabel Based on String in Swift
How to Check If a String Contains Another String in Objective-C
Ios 7: Uitableview Shows Under Status Bar
Detecting Taps on Attributed Text in a Uitextview in Ios
How to Select Multiple Images from Uiimagepickercontroller
Best Practices For Storyboard Login Screen, Handling Clearing of Data Upon Logout
Best Way to Check If Object Is Out of Bounds in Array
Undefined Symbols For Architecture Armv7
How to Make Http Request in Swift
How to Change the Name of an iOS App
Ios 8 Uitableview Separator Inset 0 Not Working
Ios - Dismiss Keyboard When Touching Outside of Uitextfield