2017-04-14 18 views
2

私のCollectionViewと同じサイズのcollectionViewセル、つまり一度に1つのCellが画面に表示され、セル間で最小間隔を10にしたい場合、問題は私がセルをスクロールすると、セルは画面全体に適切にフィットせず、セルの移動はスクロールごとに増加します。 (よりよい理解のためのスクリーンショットをチェックしてください)CollectionView Cellは水平スクロールの後に右に移動します

This is 3rd cell

This is 6th cell

enter image description here

答えて

0

コレクションビューでpagingEnabledと設定したとします。このプロパティはUIScrollViewから継承されます(UICollectionViewUIScrollViewのサブクラスなので)。

問題は、コレクションビューでは、ページの幅として独自の幅(ポスト内の320ポイント)が使用されることです。あなたのセルはそれぞれコレクションビューと同じ幅ですが、セル間に10ポイントのガターがあります。これは、セル0の左端からセル1の左端までの距離が320 + 10 = 330点であることを意味します。したがって、セル1を表示するためにスクロールすると、コレクションビューはオフセット320(独自の幅)でスクロールを停止しますが、セル1は実際にオフセット330から開始します。

最も簡単な修正はおそらくpagingEnabledをオフにし、

override func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { 
    guard let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout else { return } 

    let pageWidth = scrollView.bounds.size.width + flowLayout.minimumInteritemSpacing 

    let currentPageNumber = round(scrollView.contentOffset.x/pageWidth) 
    let maxPageNumber = CGFloat(collectionView?.numberOfItems(inSection: 0) ?? 0) 

    // Don't turn more than one more page when decelerating, and don't go beyond the first or last page. 
    var pageNumber = round(targetContentOffset.pointee.x/pageWidth) 
    pageNumber = max(0, currentPageNumber - 1, pageNumber) 
    pageNumber = min(maxPageNumber, currentPageNumber + 1, pageNumber) 
    targetContentOffset.pointee.x = pageNumber * pageWidth 
} 

ます。また、デバイスの画面サイズに合わせて項目のサイズを設定し、かつ高速に減速度を設定することをお勧めします:

このように、あなたのコレクションビューのデリゲートにscrollViewWillEndDragging(_:withVelocity:targetContentOffset:)をオーバーライドR esult:

demo

+0

ソリューションと素晴らしい説明@robmayoff、ありがとうございました。 –

0

理由は、セル(320)の幅を設定しながら、あなたがminimum separation of 10を取っていないことです。したがって、この10はスクロールするたびに蓄積されています。

したがって、幅を設定しているときに320を10から引く必要があるので、幅は310 IMOにする必要があります。

+0

私は私の計算で正確ではないかもしれないが、最小間隔の蓄積が理由ですので、あなたが考慮にそれを取らなければなりません。 –

関連する問題