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.
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)
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()
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)
}
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()