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
Antwort
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;
}
Prost Bro, ich habe versucht, ihm ein paar Mal zu sagen. Aber ich denke, er ist beharrlich in seinem eigenen Ansatz. – Pavan
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.
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];
}
}
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
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.
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
- 1. 2 UITableView in einem UIScrollView
- 2. UITableView Scrolling-Probleme, wenn in einem UIScrollView
- 3. Wie ein UITableView in einem UIScrollView
- 4. IOS: Wahl eines UIScrollView oder eines UITableView
- 5. UITableView als UIScrollView
- 6. iphone + UIScrollView oder UITableView zu verwenden Bild anzuzeigen, in Matrixformat
- 7. Erkennen Scroll-Ereignis in UIScrollView und senden an UITableView oder andere UIScrollView
- 8. Hinzufügen von UIScrollView zu einem UIViewController
- 9. IOS: UITextField + UITableView innerhalb von UIScrollView
- 10. Hinzufügen von Unteransichten in UIScrollView in einem Raster
- 11. Scrolling eine UITableView innerhalb eines UIScrollView
- 12. Hinzufügen Subviews UIScrollView .. glatt
- 13. UIScrollView in einem CALayer
- 14. Dynamisches Hinzufügen von Daten zu einem UITableView
- 15. UIScrollView innerhalb von UIScrollView in UIScrollView
- 16. UIScrollView - Hinzufügen/Entfernen von Labels
- 17. Hinzufügen zu UITableView
- 18. Iphone Dev: Hinzufügen von zwei UITableViews im selben UIScrollView
- 19. Probleme beim Hinzufügen von UITableView in einem UIViewController in Swift
- 20. UITableView Zelle hinzufügen Animation
- 21. UIButton funktioniert nicht, wenn es in UIScrollView
- 22. Programmgesteuertes Hinzufügen von UIButtons und UIImages zu einem UIScrollview
- 23. UITextField in einem UITableView
- 24. UIScrollView in UIScrollView
- 25. Zeilen und Spalten in UITableView hinzufügen iOS
- 26. Bearbeiten UITableViewCells in einem UITableView
- 27. Erhalte eine UITableView, um nicht in einem UIScrollView zu scrollen und zu wachsen
- 28. Auswahl bestimmter Bilder in einem UIScrollview
- 29. Hinzufügen von UITableView zu ViewController
- 30. Wie kann ich Objekte in UITableView hinzufügen?
Sie sind tatsächlich auf der richtigen Linie bro. Könnten Sie etwas Code von dem, was Sie versucht haben, einfügen? – Pavan
@Pavan bitte meine Antwort sehen. – Milo
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