2014-01-06 8 views
10

Ist es möglich, eine Snap-to-Position in einem UITableView oder UIScrollView hinzuzufügen? Was ich meine, ist nicht automatisches Scrollen zu einer Position, wenn ich eine Taste drücke oder eine Methode dazu aufrufen, ich meine, wenn ich meine Scroll-Ansicht oder Tabellenansicht um einen bestimmten Punkt scrolle, sagen wir 0, 30, wird es automatisch einrasten und Bleib hier? Also, wenn meine Bildlaufansicht oder Tabellenansicht scrollt und dann der Benutzer zwischen oder 0, 35 geht, wird es automatisch "snap" und blättern dort? Ich kann mir vorstellen, dass ich vielleicht eine if-Anweisung schreiben könnte, um zu testen, ob die Position in diesem Bereich in den Methoden scrollViewDidEndDragging:WillDecelerate: oder scrollViewWillBeginDecelerating: von UIScrollView liegt, aber ich bin nicht sicher, wie dies im Falle eines UITableView implementiert wird. Jede Anleitung würde sehr geschätzt werden.Snap-to-Position in einem UITableView oder UIScrollView hinzufügen

+0

Sie sind tatsächlich auf der richtigen Linie bro. Könnten Sie etwas Code von dem, was Sie versucht haben, einfügen? – Pavan

+0

@Pavan bitte meine Antwort sehen. – Milo

+0

Ich habe Ihren Beitrag Milo gesehen, und ich habe auch auf Ihren Beitrag geantwortet. Ist es nützlich, wenn ich ein xcode-Projekt für Sie einlege, wie es richtig gemacht wird, damit Sie einen dynamischen Scrollview haben, in dem Sie nicht ständig Änderungen an Ihren Scrollview-Delegate-Methoden vornehmen müssen? Es wird eine viel sauberere Lösung Buddy :) Lassen Sie es mich wissen – Pavan

Antwort

22

Wie Pavan angegeben, scrollViewWillEndDragging: withVelocity: targetContentOffset: ist die Methode, die Sie verwenden sollten. Es funktioniert mit Tabellenansichten und Bildlaufansichten. Der folgende Code sollte für Sie funktionieren, wenn Sie eine Tabellenansicht oder eine vertikale Bildlaufansicht verwenden. 44.0 ist die Höhe der Tabellenzellen im Beispielcode, daher müssen Sie diesen Wert an die Höhe Ihrer Zellen anpassen. Wenn Sie für eine horizontal rollende Bildlaufansicht verwendet werden, vertauschen Sie die y für x und ändern Sie die Breite von 44.0 in die Breite der einzelnen Bereiche in der Bildlaufansicht.

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 
{ 
    // Determine which table cell the scrolling will stop on. 
    CGFloat cellHeight = 44.0f; 
    NSInteger cellIndex = floor(targetContentOffset->y/cellHeight); 

    // Round to the next cell if the scrolling will stop over halfway to the next cell. 
    if ((targetContentOffset->y - (floor(targetContentOffset->y/cellHeight) * cellHeight)) > cellHeight) { 
     cellIndex++; 
    } 

    // Adjust stopping point to exact beginning of cell. 
    targetContentOffset->y = cellIndex * cellHeight; 
} 
+0

Prost Bro, ich habe versucht, ihm ein paar Mal zu sagen. Aber ich denke, er ist beharrlich in seinem eigenen Ansatz. – Pavan

6

Ich fordere Sie auf, stattdessen die scrollViewWillEndDragging: withVelocity: targetContentOffset: Methode zu verwenden, die für genau Ihren Zweck verwendet werden soll. um den Ziel-Content-Offset auf Ihre gewünschte Position zu setzen.

Ich schlage auch vor, dass Sie sich die doppelten Fragen ansehen, die bereits auf SO gepostet wurden.

Take a look at these posts

1

Ich glaube, dass, wenn Sie Delegat-Methode verwenden:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ 
    NSLog(@"%f",scrollView.contentOffset.y); 
    if (scrollView.contentOffset.y > 350 && scrollView.contentOffset.y < 370) 
    { 
     NSLog(@"setContentOffset"); 
     [scrollView setContentOffset:CGPointMake(0, 350) animated:YES]; 
    } 
} 

mit ihm spielen, bis Sie das gewünschte Verhalten zu bekommen. Vielleicht berechnen Sie die nächste obere Kante der nächsten TableViewCell/UIView und stoppen an der Spitze der nächsten Tabelle bei der Verlangsamung.

Der Grund dafür: if (scrollView.contentOffset.y > 350 && scrollView.contentOffset.y < 370) ist, dass die Bildlaufansicht scrollViewDidScroll in Sprüngen mit hoher Geschwindigkeit anruft, so gebe ich ein zwischen wenn.

können Sie wissen auch die Geschwindigkeit von verlangsamt:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    NSLog(@"%f",scrollView.contentOffset.y); 
    int scrollSpeed = abs(scrollView.contentOffset.y - previousScrollViewYOffset); 
    previousTableViewYOffset = scrollView.contentOffset.y; 
    if (scrollView.contentOffset.y > 350 && scrollView.contentOffset.y < 370 && scrollSpeed < minSpeedToStop) 
    { 
     NSLog(@"setContentOffset"); 
     [scrollView setContentOffset:CGPointMake(0, 350) animated:YES]; 
    } 
} 
2

Hier ist die Swift 2.0 äquivalent

func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { 
    let cellWidth = CGRectGetWidth(frame)/7 // 7 days 
    var index = round(targetContentOffset.memory.x/cellWidth) 
    targetContentOffset.memory.x = index * cellWidth 
} 

Und diese komplizierte Rundung ist nicht notwendig, überhaupt so lange wie Sie round statt floor

3

In Swift 2.0 verwenden, wenn die Tabelle eine hat Inhalt Einfügung und Vereinfachung der Dinge, ninefifteen's great answer wird:

func scrollViewWillEndDragging(scrollView:   UIScrollView, 
           withVelocity velocity: CGPoint, 
           targetContentOffset: UnsafeMutablePointer<CGPoint>) 
{ 
    let cellHeight = 44 
    let y   = targetContentOffset.memory.y + scrollView.contentInset.top + cellHeight/2 
    var cellIndex = floor(y/cellHeight) 

    targetContentOffset.memory.y = cellIndex * cellHeight - scrollView.contentInset.top; 
} 

Durch Hinzufügen von cellHeight/2 wird die if-Anweisung von ninefifteen zum Erhöhen des Index nicht mehr benötigt.

3

Wenn Sie dies wirklich manuell tun müssen, hier ist eine Swift3-Version. Es wird jedoch dringend empfohlen, Paging für die UITableView nur zu aktivieren, und dies wird bereits für Sie behandelt.

let cellHeight = 139 
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { 
    targetContentOffset.pointee.y = round(targetContentOffset.pointee.y/cellHeight) * cellHeight 
} 

// Or simply 
self.tableView.isPagingEnabled = true 
Verwandte Themen