Подтвердить что ты не робот

Reset прокрутка по UICollectionView

У меня есть горизонтальный UICollectionView, который отлично работает и свитки. Когда я нажимаю элемент, я обновляю свои данные и звоню reloadData. Это работает, и новые данные отображаются в UICollectionView. Проблема в том, что положение прокрутки не изменяется, и оно все еще просматривает последнее место. Я хочу reset прокрутку вверх (или оставлено в моем случае). Как я могу это сделать?

4b9b3361

Ответ 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)