2009-06-05 5 views
4

Ich habe einen Sound-Effekt, den ich nur spielen möchte, wenn der Slider bewegt wird.In UIKit, wie man erkennt, wenn ein UISlider sich bewegt hat, aber nicht freigegeben wurde

Momentan habe ich die playSound-Methode ausgelöst, wenn der UISlider Value Change Events sendet.

Ich brauche eine Möglichkeit zu erkennen, wenn der Schieberegler nicht bewegt wird, noch nicht freigegeben wurde.

Ich denke, ich kann die Control Events seiner Superklasse verwenden, um das Timing zu berechnen, aber ich sehe nicht, wie man sie erkennt.

Irgendwelche Ideen?

Antwort

3

Wenn ich Sie richtig verstehe, möchten Sie den Sound so lange abspielen, wie der Slider berührt wird, ob er sich bewegt oder nicht. Registrieren Sie dazu eine Methode als Ziel für UIControlEventTouchDown (und möglicherweise UIControlEventTouchDragInside) -Ereignisse und eine weitere für eine Kombination von UIControlEventTouchDragExit/TouchUpOutside/TouchUpInside/TouchCancel (je nachdem, was Sie benötigen). Die erste Methode beginnt mit der Wiedergabe des Sounds und die zweite stoppt sie.

Wenn Sie andere Ton zu spielen, wenn der Schieber noch berührt, aber nicht bewegt, würde ich empfehlen, einen Timer jedes Mal starten Sie einen Touchdown/ValueCahanged/etc Veranstaltung erhalten:

self.touchTimer = [NSTimer scheduledTimerWithTimeInterval: kDelay 
               target:self 
               selector:@selector(noMovement:) 
               userInfo:nil 
               repeats:NO]; 

Dann Immer wenn Sie einen anderen ValueChanged-Wert erhalten, brechen Sie den Timer ab und lösen einen anderen aus (oder, besser, verschieben Sie den ursprünglichen Wert). Wenn der Timer ausgelöst wird, bedeutet dies, dass der Benutzer den Schieberegler seit kDelay nicht bewegt hat und Sie den Sound ändern können. (Sie müssen den Timer abbrechen, wenn Sie auch ein TouchUpInside/Outside-Ereignis erhalten.)

+0

hilft Wie ich in der Frage erwähnt, wenn der Schieber noch unten ist aber nicht bewegt, möchte ich den Ton zu stoppen. Wenn der Benutzer danach den Schieberegler bewegt, möchte ich, dass der Ton erneut startet. Die Sache ist, es gibt fast immer eine winzige Menge an Jitter. Dies führt zu Stottern, da der Ton abgeschnitten wird, auch wenn keine (für den Benutzer sichtbare) Bewegung vorhanden ist. – willc2

+0

Sie können die gleiche Technik verwenden: Wenn Sie ein TouchDown- oder TouchDragInside-Ereignis erhalten, starten Sie einen Timer, der nach 0,5 Sekunden (oder was auch immer) ausgelöst wird. Wenn der Timer ausgelöst wird, stoppt er den aktuell wiedergegebenen Ton. Immer wenn Sie neue Ziehereignisse erhalten, brechen Sie den aktuellen Timer ab, wenn einer vorhanden ist, und starten einen neuen (oder planen den ursprünglichen Timer neu ein) und spielen den Sound natürlich wieder, wenn er gestoppt wurde. – Felixyz

1

Ich mache etwas ähnliches, und ich habe gerade meine eigene Unterklasse von UISlider erstellt. Ich implementierte die Standard-UIResponder-Touch-Funktionen und führte meinen eigenen Code aus, bevor ich mich an die Superklasse wandte. Mit diesem Ansatz erhalten Sie feinkörnigen Zugriff auf die Touch-Phase Informationen, und Sie könnten den Timer innerhalb des Schiebeobjekts setzen (scheint die beste OO Weg, es zu tun?)

Hier ist ein bisschen Code, der Ihnen erlauben würde Hinzufügen eigener Verhaltensweisen zu BerührungenBegan. Je nach Bedarf können Sie auch touchesMoved und touchesEnded überschreiben. Solange Sie sich an die Superklasse wenden, sollte sich das Verhalten des Schiebereglers nicht ändern.

In meinem Fall möchte ich, dass die graue Spur des UISlider anklickbar ist, also setze ich den Wert des Schiebereglers manuell basierend auf der Berührungsstelle.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    // set our value, if necessary 
    CGRect t = [self trackRectForBounds: [self bounds]]; 
    float v = [self minimumValue] + ([[touches anyObject] locationInView: self].x - t.origin.x - 4.0) * (([self maximumValue]-[self minimumValue])/(t.size.width - 8.0)); 
    [self setValue: v]; 

    [super touchesBegan: touches withEvent: event]; 

}

Hoffnung, dass

Verwandte Themen