【发布时间】:2016-08-08 13:05:18
【问题描述】:
我的视图中有一个集合视图。在单元格中是图像视图,它有一个部分。
我现在想以编程方式滚动图像。我希望动画无休止地发生,所以它在到达第 10 项后从第 1 项开始。
如果您提供一些方法来放置动画(例如以编程方式从右侧滑入后单元格变大),这也会很有帮助。
【问题讨论】:
标签: ios swift animation uicollectionview
我的视图中有一个集合视图。在单元格中是图像视图,它有一个部分。
我现在想以编程方式滚动图像。我希望动画无休止地发生,所以它在到达第 10 项后从第 1 项开始。
如果您提供一些方法来放置动画(例如以编程方式从右侧滑入后单元格变大),这也会很有帮助。
【问题讨论】:
标签: ios swift animation uicollectionview
有两种方法可以帮助您实现这一目标:
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)
【讨论】:
NSTimer 执行重复任务并调用setContentOffset,每次调用后值递增。
斯威夫特 5
基于Mr.Bean'sanswer,这是使用 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()
【讨论】:
guard contentOffset <= self.contentSize.width - self.bounds.size.width else { return }。
到目前为止,这是我遇到的最好的方法,诀窍是滚动到包含下一个对象的框架。请参考代码
/* -------------- 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)
}
【讨论】:
你可以使用这个 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()
【讨论】: