У меня есть горизонтальный UICollectionView
, который отлично работает и свитки. Когда я нажимаю элемент, я обновляю свои данные и звоню reloadData
. Это работает, и новые данные отображаются в UICollectionView
.
Проблема в том, что положение прокрутки не изменяется, и оно все еще просматривает последнее место. Я хочу reset прокрутку вверх (или оставлено в моем случае). Как я могу это сделать?
Reset прокрутка по UICollectionView
Ответ 1
Вы можете использовать этот метод для прокрутки к любому элементу, который вы хотите:
- (void)scrollToItemAtIndexPath:(NSIndexPath *)indexPath
atScrollPosition:(UICollectionViewScrollPosition)scrollPosition
animated:(BOOL)animated
Ответ 2
Вы хотите setContentOffset:
. Для CGPoint и аргумента требуется, чтобы вы могли установить, что хотите, используя CGPointMake, но если вы хотите вернуться к самому началу коллекции, вы можете просто использовать CGPointZero.
[collectionView setContentOffset:CGPointZero animated:YES];
Ответ 3
Я использую это довольно часто в разных частях моего приложения, поэтому я просто расширил UIScrollView, чтобы его можно было использовать в любом проспекте прокрутки и подклассе прокрутки:
extension UIScrollView {
/// Sets content offset to the top.
func resetScrollPositionToTop() {
self.contentOffset = CGPoint(x: -contentInset.left, y: -contentInset.top)
}
}
Поэтому всякий раз, когда мне нужно reset позицию:
self.collectionView.resetScrollPositionToTop()
Ответ 4
В Swift:
collectionView.setContentOffset(CGPointZero, animated: true)
Если вы оставите представление, в котором находится просмотр коллекции, внесите изменения во второй контроллер представления и вам нужно обновить коллекцию при возврате:
@IBAction func unwindTo_CollectionViewVC(segue: UIStoryboardSegue) {
//Automatic table reload upon unwind
viewDidLoad()
collectionView.reloadData()
collectionView.setContentOffset(CGPointZero, animated: true)
}
В моей ситуации разматывание отлично, потому что вызов viewDidLoad обновит контекст CoreData, вызов reloadData будет проверять, что обновления коллекцииView отражают новый контекст CoreData, а затем contentOffset убедится, что таблица вернется в начало,
Ответ 5
CGPointZero в моем случае переместил содержимое коллекции, потому что вы не учитываете содержимое вставки. Вот что это сработало для меня:
CGPoint topOffest = CGPointMake(0,-self.collectionView.contentInset.top);
[self.collectionView setContentOffset:topOffest animated:YES];
Ответ 6
Извините, я не мог комментировать на момент написания этой статьи, но я использовал UINavigationController, а сам CGPointZero
не довел меня до самого верха, поэтому мне пришлось использовать следующее.
CGFloat compensateHeight = -(self.navigationController.navigationBar.bounds.size.height+[UIApplication sharedApplication].statusBarFrame.size.height);
[self.collectionView setContentOffset:CGPointMake(0, compensateHeight) animated:YES];
Надеюсь, это поможет кому-то в будущем. Ура!
Ответ 7
Если вы видите контроллер содержит безопасную область, код:
collectionView.setContentOffset(CGPointZero, animated: true)
не работает, поэтому вы можете использовать универсальное расширение:
extension UIScrollView {
func scrollToTop(_ animated: Bool) {
var topContentOffset: CGPoint
if #available(iOS 11.0, *) {
topContentOffset = CGPoint(x: -safeAreaInsets.left, y: -safeAreaInsets.top)
} else {
topContentOffset = CGPoint(x: -contentInset.left, y: -contentInset.top)
}
setContentOffset(topContentOffset, animated: animated)
}
}
Ответ 8
Чтобы справиться с UINavigationController
и прозрачной навигационной панелью, мне пришлось вычислять дополнительное верхнее смещение, чтобы идеально соответствовать положению первого элемента.
Код Swift 1.1:
let topOffest = CGPointMake(0, -(self.collectionView?.contentInset.top ?? O))
self.collectionView?.setContentOffset(topOffest, animated: true)
Ура!
Ответ 9
- SWIFT 4.2. SOLUTION- Скажем, у меня есть tableView, в котором каждый tableViewCell содержит HorizontalCollectionView. Из-за повторного использования ячеек, хотя первый tableViewCell прокручивается, чтобы сказать страницу 4, вниз, для другой ячейки также устанавливается страница 4.
Это работает в таком cases- В функции cellForRowAt в tableView, пусть cell =//объявление ячейки с использованием deque cell.myCollectionView.contentOffset = CGPoint (x: 0, y: 0)