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?

War es hilfreich?

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".

bewegen

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top