Vorhersagen der in einem UIScrollView Offset Stillegung nach Abbremsung
-
22-07-2019 - |
Frage
Ich möchte in der Lage sein, die letzte Ruhe innerhalb eines UIScrollView nach einem leichten Schlag Geste Offset vorherzusagen. Es braucht nicht pixelgenau zu sein, aber nahe genug, so dass der Benutzer keinen Unterschied nicht wahrnimmt (das heißt es nicht übermäßig weniger bewegt oder mehr, als sie es gewohnt sind).
Ich weiß, dass jemand fragt, so: Warum? Ich habe eine Tabelle Ansicht artige Menüsteuerung innerhalb eines UIScrollView. Ich möchte es machen, so dass die meisten Top-Menüpunkt vollständig angezeigt und bündig an die Spitze des UIScrollView. UIScrollView die Paging-Funktion ist nicht ganz das, was ich will, weil ein starker Film nicht über ein Vielfaches der Ansicht Grenzen fliegt.
Umgang mit normalen Touch-Ereignissen ist einfach genug. Auf touchesEnded:withEvent:
, kann ich auf den nächsten ganzen Menüpunkt blättern. Der schwierige Teil ist Verzögerung.
Es gibt zwei Konstanten für die Verzögerungsrate, UIScrollViewDecelerationRateNormal
und UIScrollViewDecelerationRateFast
. Ihre Werte sind 0,998 und 0,990 in iPhone OS 3.0. Ich habe versucht, die Mathematik, um herauszufinden, die Apple verwendet Bewegung zu verlangsamen, aber ich komme leer aus.
Wenn ich mit einiger Genauigkeit versetzten die letzten Ruhevorhersagen kann, dann während der Verzögerung früh ich einfach scrollRectToVisible:animated:
verwenden kann, um einen mit einem Menüpunkt bündig an die Spitze der Ansicht Grenzen versetzt zu bewegen.
Stellen Sie keine Mathe-veranlagte Menschen wissen, was Apple kann während der Verzögerung tun? Sollte ich eine Reihe von Zahlen der Verzögerung Ereignisse sammeln, grafisch darstellen und sie kommen mit etwas in der Nähe?
Lösung
Steuer UIScrollView des targetContentOffset in iOS 5
UIScrollViewDelegate
hat eine neue Methode: < a href = "http://developer.apple.com/library/IOS/documentation/UIKit/Reference/UIScrollViewDelegate_Protocol/Reference/UIScrollViewDelegate.html#//apple_ref/doc/uid/TP40006923-CH3-SW15"> scrollViewWillEndDragging:withVelocity:targetContentOffset:
.
Das paßt perfekt mit dem, was Sie tun mögen.
Diese Methode wird nicht aufgerufen, wenn der Wert der Spirale nach Ansicht des pagingEnabled Eigenschaft ist JA. Ihre Anwendung kann den Wert ändern des targetContentOffset Parameter, wo die Scrollview anzupassen beendet seine Scrollen Animation.
Alternative Lösung für iOS4 und Nieder
Ändern Sie den UIScrollView
's decelerationRate
UIScrollViewDecelerationFast
und dann in scrollViewDidEndDecelerating
auf die nächste "Seite".
Die schnelle Verzögerung ermöglicht die kompletten Anhalte / Gleiten über ein wenig mehr natürliche / weniger widerwärtig.
Andere Tipps
Sie können die Geschwindigkeit des Scrollens beobachten, während die UIScrollView verzögert wird, und wenn die Geschwindigkeit unter einen bestimmten Wert fällt, fangen Sie den nächsten Menüpunkt.
Sie wollen wahrscheinlich die UIScrollViewDelegate
Methoden scrollViewDidEndDragging:willDecelerate:
und scrollViewDidScroll:
. Wenn der Benutzer seinen Finger hebt eine Scroll-Geste zu beenden, wird scrollViewDidEndDragging:willDecelerate:
aufgerufen werden. Beginnen Sie die scrollViewDidScroll:
Ereignisse überwachen und beobachten das Delta zwischen der aktuellen Position des UIScrollView
und seiner vorherigen Position, durch die Zeit Delta unterteilt:
float velocity = (currentPosition - lastPosition) / (currentTime - lastTime);
Wenn die Geschwindigkeit unter einen Minimalwert fällt, rufen scrollRectToVisible:animated:
auf dem UIScrollView
.
ich nicht kommentieren kann (Ich glaube, ich 50 rep müssen), so ist dies nicht eine vollständige Antwort, aber die 0.998 und 0.990 Werte für die Verzögerung gegeben, meine Instinkte sind, dass sie einfach die aktuelle Geschwindigkeit, die durch die Verzögerungsrate jeden Rahmen multiplizieren.