我的视图中有一个集合视图。在单元格中是图像视图,它有一个部分。
我现在想以编程方式滚动图像。我希望动画无止境地发生,所以它在到达第10项后从第一项开始。
如果你提供一些方法,在从右边以编程方式刷入后放置像单元格变大的动画也会有所帮助。
答案 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()