ビューにコレクションビューがあります。セルには画像ビューがあり、1つのセクションがあります。
プログラムで画像をスクロールしたいと思います。アニメーションが無限に発生するようにして、アイテム10に到達した後、アイテム1から開始します。
プログラムで右からスワイプした後、セルが大きくなるようなアニメーションを配置する方法を提供することも役立ちます。
これを達成するのに役立つ2つの方法があります。
func scrollToItemAtIndexPath(indexPath: NSIndexPath,
atScrollPosition scrollPosition: UICollectionViewScrollPosition,
animated animated: Bool)
または
func setContentOffset(contentOffset: CGPoint,
animated animated: Bool)
どちらもUICollectionView
にあるので、便利なものは何でも使用できます。ただし、このためのカスタムアニメーションを作成することはより困難です。必要なものに応じた簡単な解決策は この答え です。
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
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()
これまでのところ、これは私が遭遇した最良のアプローチです。トリックは、次のオブジェクトを含むフレームまでスクロールすることです。コードを参照してください
/* -------------- 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()