2017-05-03 3 views
1

Jetzt habe ich eine UICollectionView eingerichtet mit horizontalen Paging. Ich habe meine Zellen so skaliert, dass sie auf den Bildschirm passen, so dass nur einer sichtbar ist (außer Sie scrollen).Welche Seite von UICollectionView ist sichtbar?

Was ich tun möchte, ist der Indexpfad der Zelle, die in Sicht ist, sobald Sie mit dem Scrollen aufhören. Dies liegt daran, dass andere Teile der Ansicht von den aktuell sichtbaren Informationen abhängig sind.

Ich habe eine Funktion in der ScrollViewWillBeginDecelerating-Funktion eingerichtet und ich bin in der Nähe, aber ich verstehe immer noch nicht, wie es die Zellen ergreift.

func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) { 

    if(lastContentOffset > scrollView.contentOffset.x && lastPointVisited > 0) 
    { 
     lastPointVisited -= 1 

     print("Scrolling Right") 
    } 
    else if(lastContentOffset < scrollView.contentOffset.x && lastPointVisited < myPoints.count - 1) 
    { 
     lastPointVisited += 1 

     print("Scrolling Left") 
    } 

    lastContentOffset = scrollView.contentOffset.x 
} 

Dies bringt mir genaue Ergebnisse, wenn ich sehr vorsichtig mit dem Scrollen bin. Schnelles oder nur halbes Scrollen einer Seite, so dass es zurückschnappt, scheint alles abzuschütteln.

+0

Warum verwenden Sie 'scrollViewWillBeginDecelerating' anstelle von' scrollViewDidScroll' oder 'scrollViewDidEndScrollingAnimation' '. Es ist nicht klar aus deiner Frage, was du tatsächlich beobachtest, was nicht zu erwarten ist. Was ist das eigentliche Problem? Was wird "abgeworfen"? –

+0

Warum verwenden Sie nicht stattdessen einen 'UIPageViewController'? – Sweeper

+0

Ich benutzte 'scrollViewWillBeginDecelerating', weil ich damit beginnen wollte, eine Karte basierend darauf zu verschieben, was als nächstes in der Sammlungsansicht kam. Obwohl ich nach der Antwort von @RajatJangra aus der untenstehenden Antwort folge, merke ich, dass es keinen Unterschied im Timing macht und zu warten, bis das Scrollen vollständig abgeschlossen ist. –

Antwort

0

Es funktioniert für mich, wenn ich den gleichen Code in diesen beiden Delegierten gleichzeitig

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
    //code here 
} 
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { 
    //code here 
} 

davon in

func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) 

schreiben stattdessen setzen Sie gibt mir den genauen Wert des Index, ob es scrollt schnell oder halb gescrollt.

Hoffe es hilft!

+0

Ah. Nur der Wechsel von scrollViewWillBeginDecelerating zu scrollViewDidEndDecelerating hat mein Problem gelöst. Es war das teilweise Scrollen zwischen dem Wechsel von einer Seite zur anderen, die meine Funktion abwarf. Ich danke dir sehr! –

0

können Sie folgenden Code verwenden, um Seitennummer

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

versuchen dies zu umgehen,

func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) { 
     let cellObj = collectionViewDemo.visibleCells[0] 
     print(collectionViewDemo.indexPath(for: cellObj)) 
    } 
0

Sie können den Code unten verwenden wird es immer wirksam sein, um die sichtbaren Kollektion Seite zu finden

func scrollViewDidScroll(_ scrollView: UIScrollView) { 

    let pageWidth = scrollview.frame.width 
    let pageIndex = scrollview.frame.width 
       let indexTemp = Int((scrollview.contentOffset.x + 
    pageWidth/2)/pageWidth) 

     print(pageIndex) 

} 
Verwandte Themen