web-dev-qa-db-fra.com

Comment faire défiler par programme une vue de collection?

J'ai une vue de collection à mon avis. Dans les cellules se trouvent des vues d'image et il a une section.

Je veux maintenant faire défiler par programme les images. Je veux que l'animation se produise sans fin, elle commence donc par le premier élément après avoir atteint le point 10.

Il serait également utile de fournir une méthode pour placer des animations telles que les cellules grossissant après avoir été programmées à partir de la droite.

17
Lenny1357

Deux méthodes peuvent vous aider à y parvenir:

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

ou

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

Les deux sont sur UICollectionView afin que vous puissiez utiliser ce qui vous semble le plus pratique. Il est cependant plus difficile de créer une animation personnalisée pour cela. Une solution rapide en fonction de ce dont vous avez besoin pourrait être cette réponse .

Swift 4, iOS 11:

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

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

Swift 5

Basé sur Mr.Bean'sanswer , voici une manière élégante d'utiliser l'extension 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)
    }
}

Vous pouvez maintenant l'utiliser où vous le souhaitez:

collectionView.scrollToNextItem()
collectionView.scrollToPreviousItem()
19
Đorđe Nilović

C'est de loin la meilleure approche que j'ai rencontrée, l'astuce consiste à faire défiler jusqu'au cadre contenant les objets suivants. Veuillez vous référer au code

/* -------------- 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)
}
10
Mr. Bean

Vous pouvez utiliser cette extension 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)
        }
    }

Et l'utilisation sera comme

yourCollectionView.scrollToNextItem()
yourCollectionView.scrollToPreviousItem()
2
Sreeraj VR