2011-01-02 4 views
24

Apples iPod (Musik) App hat einen Schieberegler (UISlider, ich nehme an) mit variablen Scrubbing-Geschwindigkeiten: je weiter weg von dem Schieberegler vertikal ziehen, desto kleiner ist der Anteil Ihrer horizontalen Ziehgeschwindigkeit, die sich in der Wertänderung des Schiebereglers widerspiegelt. Hat jemand herausgefunden, wie man dieses Verhalten dupliziert?UISlider mit variablen Scrubbing-Geschwindigkeiten (wie iPod App)

Antwort

31

Gute Frage, die mich inspiriert hat, eine Lösung zu finden. Ich habe eine Klasse namens OBSlider erstellt, die variable Scrubbing-Geschwindigkeiten unterstützt.

Die Lösung in Kürze: Unterklasse UISlider, überschreiben -continueTrackingWithTouch:withEvent: und die Berechnung der Änderung von self.value abhängig von der Bewegung der Berührung selbst vornehmen. Dadurch können Sie den Faktor, mit dem Sie die Touch-Bewegung multiplizieren möchten, frei beeinflussen, um zum neuen Slider-Wert zu gelangen.

Für Details lesen Sie bitte meinen Blogpost: OBSlider, a UISlider subclass with variable scrubbing speed.

+0

Sehr schön. Es macht nicht ganz das, was der iPod App-Schieberegler tut - beachten Sie, wenn Sie in einiger Entfernung vom iPod App Scrubber ziehen und weiter nach oben zum Schieberegler ziehen, bewegt sich der Daumen auf Sie zu, bis Sie am Schieberegler ankommen. Sie haben jedoch auf jeden Fall gezeigt, welche Werte manipuliert werden müssen. (Auch ich überschreibe 'continueTrackingWithTouch: withEvent:' und setze 'self.value', aber ich habe einfach nicht das richtige Verhalten bekommen.) – matt

+0

@matt: Ja, mir ist aufgefallen. Ich bin mir nicht sicher, ob ich das Verhalten des iPods besser finde. –

+0

@matt: Ich habe den Code so geändert, dass er sich mehr wie der Schieberegler in der iPod App verhält. –

4

Gute Arbeit Ole! Ich habe ein paar kleinere Änderungen vorgenommen, um die Funktionsweise des iPod App Sliders zu verbessern, wenn ich den Finger näher an den UISlider ranziehe! Grundsätzlich handle ich mit einer Variablen, um den Wert zu messen, der der Fingerposition entspricht, und wenn der Benutzer näher kommt, wende ich eine andere Formel an (die nicht perfekt ist und viel verbessert werden könnte).

Meine Gabel ist hier verfügbar: http://github.com/sylverb/OBSlider

+0

@Sylverb: Ich habe deine Antwort hier erst vor einem Moment gesehen und ich habe nur ein paar Modifikationen vorgenommen, damit es sich mehr wie der iPod verhält. Werde jetzt deine Änderungen überprüfen, vielleicht möchtest du dir meine ansehen. –

+1

@Ole Begemann: Es sieht immer noch ganz anders als der iPod-Player-Schieberegler: - die Positionsänderung sollte nur auftreten, wenn der Benutzer näher an den Schieberegler kommt. In Ihrer Implementierung tritt die Änderung auf, wenn y Koordinaten ändert - die Schieberegler-Änderung scheint die scrubbingSpeed-Schritte zu folgen, statt linear zu sein! Meine Modifikationen sind noch nicht perfekt (die Formel, um den Einfluss der y-Koordinate zu integrieren ist nicht perfekt), aber es hat ein Verhalten ähnlich dem im ipod-Player! – Sylverb

+0

Sie haben Recht, ich sollte den Wert nicht ändern, wenn Sie vom Schieberegler wegziehen. –