Как программно прокручивать представление коллекции?

У меня есть представление коллекции на мой взгляд. В ячейках представлены виды изображений, и он имеет один раздел.

Теперь я хочу прокручивать программно через изображения. Я хочу, чтобы анимация была бесконечной, поэтому она начинается с пункта 1 после достижения пункта 10.

Также было бы полезно, если бы вы предоставили какой-либо метод, по которому анимации, подобные ячейкам, становились бы больше после того, как программно проскочили справа.

Ответ 1

Есть два метода, которые могут помочь вам достичь этого:

func scrollToItemAtIndexPath(indexPath: NSIndexPath,
        atScrollPosition scrollPosition: UICollectionViewScrollPosition,
                animated animated: Bool)

или

func setContentOffset(contentOffset: CGPoint,
         animated animated: Bool)

Оба на UICollectionView, поэтому вы можете использовать все, что кажется более удобным. Однако создать собственную анимацию для этого сложнее. этот ответ может быть быстрым решением в зависимости от того, что вам нужно.

Swift 4, iOS 11:

// UICollectionView method
func scrollToItem(at indexPath: IndexPath, 
                  at scrollPosition: UICollectionViewScrollPosition,  
                  animated: Bool)

// UIScrollView method
func setContentOffset(_ contentOffset: CGPoint, animated: Bool)

Ответ 2

Swift 4, iOS 11

Основываясь на ответе Mr.Bean answer, вот элегантный способ использования расширения UICollectionView:

extension UICollectionView {
    func scrollToNextItem() {
        let contentOffset = CGFloat(floor(self.contentOffset.x + self.bounds.size.width))
        self.moveToFrame(contentOffset: contentOffset)
    }

    func scrollToPreviousItem() {
        let contentOffset = CGFloat(floor(self.contentOffset.x - self.bounds.size.width))
        self.moveToFrame(contentOffset: contentOffset)
    }

    func moveToFrame(contentOffset : CGFloat) {
        self.setContentOffset(CGPoint(x: contentOffset, y: self.contentOffset.y), animated: true)
    }
}

Теперь вы можете использовать его где угодно:

collectionView.scrollToNextItem()
collectionView.scrollToPreviousItem()

Ответ 3

На сегодняшний день это лучший подход, с которым я столкнулся, трюк заключается в прокрутке к кадру, который содержит следующие объекты. Пожалуйста, ознакомьтесь с кодом

/* -------------- display previous friends action ----------------*/
@IBAction func actionPreviousFriends(_ sender: Any) {

    let collectionBounds = self.collectionView.bounds
    let contentOffset = CGFloat(floor(self.collectionView.contentOffset.x - collectionBounds.size.width))
    self.moveToFrame(contentOffset: contentOffset)
}

/* -------------- display next friends action ----------------*/
@IBAction func actionNextFriends(_ sender: Any) {

    let collectionBounds = self.collectionView.bounds
    let contentOffset = CGFloat(floor(self.collectionView.contentOffset.x + collectionBounds.size.width))
    self.moveToFrame(contentOffset: contentOffset)
}

func moveToFrame(contentOffset : CGFloat) {

    let frame: CGRect = CGRect(x : contentOffset ,y : self.collectionView.contentOffset.y ,width : self.collectionView.frame.width,height : self.collectionView.frame.height)
    self.collectionView.scrollRectToVisible(frame, animated: true)
}

Ответ 4

Вы можете использовать это расширение UICollectionView (Swift 4.2)

        extension UICollectionView {

        func scrollToNextItem() {
            let scrollOffset = CGFloat(floor(self.contentOffset.x + self.bounds.size.width))
            self.scrollToFrame(scrollOffset: scrollOffset)
        }

        func scrollToPreviousItem() {
            let scrollOffset = CGFloat(floor(self.contentOffset.x - self.bounds.size.width))
            self.scrollToFrame(scrollOffset: scrollOffset)
        }

        func scrollToFrame(scrollOffset : CGFloat) {
            guard scrollOffset <= self.contentSize.width - self.bounds.size.width else { return }
            guard scrollOffset >= 0 else { return }
            self.setContentOffset(CGPoint(x: scrollOffset, y: self.contentOffset.y), animated: true)
        }
    }

И использование будет как

yourCollectionView.scrollToNextItem()
yourCollectionView.scrollToPreviousItem()