如何以编程方式滚动集合视图?

时间:2016-04-16 15:31:57

标签: ios swift animation uicollectionview

我的视图中有一个集合视图。在单元格中是图像视图,它有一个部分。

我现在想以编程方式滚动图像。我希望动画无止境地发生,所以它在到达第10项后从第一项开始。

如果你提供一些方法,在从右边以编程方式刷入后放置像单元格变大的动画也会有所帮助。

4 个答案:

答案 0 :(得分:19)

有两种方法可以帮助您实现这一目标:

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

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

两者都在UICollectionView上,所以你可以使用看起来更方便的东西。然而,为此创建自定义动画更加困难。根据您的需要提供快速解决方案可能是this answer

Swift 4,iOS 11:

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

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

答案 1 :(得分:13)

Swift 4,iOS 11

基于Mr.Bean's 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()

答案 2 :(得分:9)

到目前为止,这是我遇到的最好的方法,诀窍是滚动到包含下一个对象的框架。请参考代码

/* -------------- 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)
}

答案 3 :(得分:2)

您可以使用此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()