2012-09-04 4 views
5

Ich versuche, Paging für benutzerdefinierte Seiten in der UITableView implementieren. Was ich versuche zu erreichen ist, dass die Oberseite der aktiven Zelle mit der Oberseite der TableView ausgerichtet ist, während immer noch die Spitze der nächsten Zelle am unteren Rand der TableView angezeigt wird (um den Benutzer zu scrollen und mehr zu sehen) Zellen).UITableView mit benutzerdefinierten Paging-ähnlichen Verhalten

Meine Zellen sind alle gleich groß.

Wenn ich paging=YES setze, ergibt dies einen leichten Offset, der zunimmt, wenn ich die Seiten durchblättere. Dies liegt daran, dass meine TableView etwas größer als eine einzelne Zelle ist und die Zellenhöhe/Seitengröße nicht ausgerichtet ist.

Ich habe verschiedene Dinge mit Paging aktiviert versucht. Ich habe versucht, die Größe der TableView auf die Höhe der Zelle zu setzen, aber dann Clipping und Maskierung deaktivieren, damit der Benutzer die nächste Zelle immer noch sehen konnte. Dies funktioniert nicht, da die nächste Zelle nur zu der letzten ms, bevor die Zelle in die Bounding Box der tableView scrollt, zur zugrunde liegenden scrollView hinzugefügt wird.

Ich fing dann an, die verschiedenen scrollView delegate Methoden zu implementieren, um das Pagingverhalten nachzuahmen - ich kann nicht scheinen, es richtig zu machen.

Ich habe unter anderem versucht, etwas wie folgt aus:

- (void) scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 
{ 
    float cellHeight = [myCell rowHeight]; 
    int index = floorf(scrollView.contentOffset.y/cellHeight); 

    *targetContentOffset = CGPointMake(targetContentOffset->x, targetContentOffset->y = (index * cellHeight)); 
} 

Während es irgendwie das Richtige tut, ist es nichts, wie ein Scrollview/Tableview mit Paging aktiviert verhält.

Ich habe hier ein paar Posts von Leuten gefunden, die versuchen, dasselbe zu erreichen, aber die Antworten leiden unter dem gleichen "non-native-snap-feel", dass alles, was ich versucht habe, tut.

Danke für jede Hilfe gegeben.

iOS> = 5.0

+0

hast du es funktioniert? – aqs

+0

@aqs Entschuldigung nein, es hat nie wirklich gut genug funktioniert, um als Seitenumbruch darzustellen. – RickiG

+0

macht nichts. Ich nahm diese https://github.com/100grams/HGPageScrollView und modifizierte, um es vertikal zu scrollen. dient meinem Zweck – aqs

Antwort

3

Wenn Sie deaktivieren Paging Sie die UIScrollView Delegatfunktion verwenden können:

-(void)scrollViewWillEndDragging:(UIScrollView*)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint*)targetContentOffset { 

    // Get index path for target row 
    NSIndexPath* indexPath = [self.tableView indexPathForRowAtPoint:(*targetContentOffset)]; 

    // Set new target 
    (*targetContentOffset) = [self.tableView rectForRowAtIndexPath:indexPath].origin; 

} 
11

scrollViewWillEndDragging:withVelocity:targetContentOffset: Implement oben zurückzukehren Koordinate der Zelle am nächsten targetContentOffset, nicht am nächsten zu Ihrem Ausgang Offset. Die Lösung, die jjv360 zur Verfügung stellt, macht das gut, aber Sie könnten es ein wenig zwicken, abhängig davon, wie hoch Ihre Zellen im Durchschnitt sind (die Lösung von jjv360 könnte bei wirklich großen Zellen zu schnell sein).

Ich möchte nur hinzufügen, dass Sie UITableView ‚s Verzögerung schneller machen kann mehr wie UIScrollView durch Änderung seiner decelerationRate Eigenschaft ausgelagert verhalten (tun Sie es einfach einmal in init/viewDidLoad/wo auch immer).

self.tableView.decelerationRate = UIScrollViewDecelerationRateFast; 
+0

Danke Filip, ich werde es gerade jetzt ausprobieren.Beim Paging mit dem nativen Verhalten können Sie nicht mehrere Seiten überspringen, was genau passiert, wenn ich den Endpunkt an targetContentOffset anhefte - es muss nur die nächste oder vorherige Zelle sein. decelerationRate - das habe ich vorher nicht gesehen, super :) – RickiG

+0

Sieht so aus, als ob die pause funktioniert, wenn Paging aktiviert ist. Danke, dass du diese API trotzdem angegeben hast :) – Tomasz

1

löste ich dieses Problem mit diesem Code:

- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView { 

    CGFloat pageWidth = self.collectionView.frame.size.width + 10 /* Optional Photo app like gap between images */; 

    _currentPage = floor((self.collectionView.contentOffset.x - pageWidth/2)/pageWidth) + 1; 

    NSLog(@"Dragging - You are now on page %i", _currentPage); 
} 

-(void) scrollViewWillEndDragging:(UIScrollView*)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint*)targetContentOffset { 

    CGFloat pageWidth = self.collectionView.frame.size.width + 10; 

    int newPage = _currentPage; 

    if (velocity.x == 0) // slow dragging not lifting finger 
    { 
     newPage = floor((targetContentOffset->x - pageWidth/2)/pageWidth) + 1; 
    } 
    else 
    { 
     newPage = velocity.x > 0 ? _currentPage + 1 : _currentPage - 1; 

     if (newPage < 0) 
      newPage = 0; 
     if (newPage > self.collectionView.contentSize.width/pageWidth) 
      newPage = ceil(self.collectionView.contentSize.width/pageWidth) - 1.0; 
    } 

    NSLog(@"Dragging - You will be on %i page (from page %i)", newPage, _currentPage); 

    *targetContentOffset = CGPointMake(newPage * pageWidth, targetContentOffset->y); 
} 

Dank http://www.mysamplecode.com/2012/12/ios-scrollview-example-with-paging.html den richtigen Weg für den Hinweis.

Verwandte Themen