しばらくこの質問を見つけようとしましたが、この問題の答えを見つけることができませんでした。私の問題は、UICollectionView
があり、スクロール方向がHorizontal
で、Paging Enabled
。私の問題は、ユーザーがいる現在のページ番号のタックを保持したいので、int
変数を作成し、ユーザーが右または左にスワイプするたびに1ずつ加算または減算することです。 scrollView
のデリゲートを使用してみました
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
しかし、ユーザーが右または左にスワイプすると、UICollectionView
のページの列数と同じ回数だけ呼び出され、ユーザーが次のページに移動したかどうかを知らせません前のもの。
使用する :
_- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
CGFloat pageWidth = collectionView.frame.size.width;
float currentPage = collectionView.contentOffset.x / pageWidth;
if (0.0f != fmodf(currentPage, 1.0f))
{
pageControl.currentPage = currentPage + 1;
}
else
{
pageControl.currentPage = currentPage;
}
NSLog(@"Page Number : %ld", (long)pageControl.currentPage);
}
_
また、pageControlを使用していない場合は、ceil(currentPage)
が現在のページ番号になります。
Swift 3 Xcode 8.2
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let x = scrollView.contentOffset.x
let w = scrollView.bounds.size.width
let currentPage = Int(ceil(x/w))
// Do whatever with currentPage.
}
@Shankar BSの回答に基づいて、Switでこのように実装しました。 CollectionViewDelegateはScrollViewDelegateに準拠していることに注意してください。
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let pageWidth = scrollView.frame.size.width
let page = Int(floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1)
print("page = \(page)")
}
以下のような現在のページを取得できます。インデックスは0
から(total page - 1)
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
CGFloat pageWidth = scrollView.frame.size.width;
int page = floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
NSLog(@"Current page -> %d",page);
}
Swift 2.2
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
let x = collectionView.contentOffset.x
let w = collectionView.bounds.size.width
let currentPage = Int(ceil(x/w))
print("Current Page: \(currentPage)")
}