2015-04-08 25 views
18

'da sayfa değişikliğini algıla Bu soruyu bir süre bulmayı denedim, ancak bu sorunun yanıtını bulamadım. Benim sorunum, bir UICollectionView ve kaydırma yönünün ile Horizontal olmasıdır. Benim sorunum, kullanıcının bulunduğu mevcut sayfa numarasının yapışmasını sağlamaktır, bu yüzden bir int değişken oluşturdum ve şimdi kullanıcı sağa veya sola doğru her seferinde 1 ekleyip çıkarmak istiyorum. Ben scrollView 'ın temsilciUICollectionView

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 

kullanarak çalıştı ancak kullanıcı sağa veya sola ucuz bira, bunun UICollectionView bir sayfada sütun sayısı olarak kez birçok numara olarak adlandırılan artı alışkanlık bana bildirmek edilir kullanıcının bir sonraki sayfaya mı yoksa bir önceki sayfaya mı gitmiş olduğu.

cevap

27

Kullanım:

- (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); 
} 

Ve herhangi pagecontrol kullanmıyorsanız, o zaman ceil(currentPage) geçerli sayfa numarası olacaktır.

+0

bu ihtiyacı gibi mükemmel çalışıyor, sadece anlayamadık Bu şartlar onları kendi kendime değiştirdi, ama bir problem var, bu yöntem UICollectionView '- (UICollectionViewCell *) colle delegesinden sonra çağrılıyor ctionView: (UICollectionView *) collectionView cellForItemAtIndexPath: (NSIndexPath *) indexPath' ancak sayfa numara değişkeni 'ScrollView' delegesinde değişir, bu yüzden gerektiği gibi çalışmıyor, herhangi bir çözüm var mı? –

+0

Bu normal bir davranış, bu yöntem sadece koleksiyon görünüm kaydırma durduğunda ateşlenir .. !! – itsji10dra

+0

Evet, haklısın .. Durumum için bir alternatif bulmaya çalışacağım ama soru için bu mükemmel bir cevap. Yardım için teşekkürler. –

8

u aşağıda gibi geçerli sayfayı alabilirsiniz endeks ben Swit içinde bunu böyle uyguladık @Shankar BS 'nin cevabı dayanarak 0 itibaren (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); 
} 
+0

Teşekkürler bir demet .. :) Bu yöntemin UICollectionView's 'delegesi '- (UICollectionViewCell *) collectionView: (UICollectionView *) collectionView cellForItemAtIndexPath: (NSIndexPath *) indexPath' önce çağrılmasının herhangi bir yolu var mı? –

7

olacaktır. ScrollViewDelegate için CollectionViewDelegate uyan unutmayın:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
    let pageWidth = scrollView.frame.size.width 
    let page = Int(floor((scrollView.contentOffset.x - pageWidth/2)/pageWidth) + 1) 
    print("page = \(page)") 
} 
3

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)") 
} 
+4

Sadece kod olarak yanıt olarak değil, bağlam veya yorum eklemelisiniz. – NickyvV

12

** 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. 
} 
+0

Çok teşekkür ederim. :) – iPeter