Wie erkennt man das Ereignis, wenn der Benutzer das Ziehen eines Schiebereglers beendet hat?
Wenn Sie zwischen dem Ziehen keine Daten benötigen, sollten Sie einfach Folgendes festlegen:
[mySlider setContinuous: NO];
Auf diese Weise erhalten Sie das Ereignis valueChanged
nur, wenn der Benutzer den Schieberegler nicht mehr bewegt.
Sie können eine Aktion hinzufügen, die zwei Parameter, Absender und ein Ereignis für UIControlEventValueChanged übernimmt:
[slider addTarget:self action:@selector(onSliderValChanged:forEvent:) forControlEvents:UIControlEventValueChanged]
Überprüfen Sie dann die Phase des Touch-Objekts in Ihrem Handler:
- (void)onSliderValChanged:(UISlider*)slider forEvent:(UIEvent*)event {
UITouch *touchEvent = [[event allTouches] anyObject];
switch (touchEvent.phase) {
case UITouchPhaseBegan:
// handle drag began
break;
case UITouchPhaseMoved:
// handle drag moved
break;
case UITouchPhaseEnded:
// handle drag ended
break;
default:
break;
}
}
Schnelle 4 & 5
slider.addTarget(self, action: #selector(onSliderValChanged(slider:event:)), for: .valueChanged)
@objc func onSliderValChanged(slider: UISlider, event: UIEvent) {
if let touchEvent = event.allTouches?.first {
switch touchEvent.phase {
case .began:
// handle drag began
case .moved:
// handle drag moved
case .ended:
// handle drag ended
default:
break
}
}
}
Beachten Sie beim Hinzufügen einer Aktion im Interface Builder, dass Sie auch die Option haben, der Aktion sowohl Absender- als auch Ereignisparameter hinzuzufügen.
Ich verwende die Benachrichtigungen "Nachbessern innen" und "Nachbessern außen".
Interface Builder:
Verbinden Sie beide Benachrichtigungen im Interface Builder mit Ihrer Empfangsmethode. Die Methode könnte so aussehen:
- (IBAction)lengthSliderDidEndSliding:(id)sender {
NSLog(@"Slider did end sliding... Do your stuff here");
}
im Code:
Wenn Sie es programmgesteuert verkabeln möchten, haben Sie so etwas in Ihrem viewWillAppear (oder wo immer es Ihnen passt) -Aufruf:
[_mySlider addTarget:self
action:@selector(sliderDidEndSliding:)
forControlEvents:(UIControlEventTouchUpInside | UIControlEventTouchUpOutside)];
Die Empfangsmethode würde folgendermaßen aussehen:
- (void)sliderDidEndSliding:(NSNotification *)notification {
NSLog(@"Slider did end sliding... Do your stuff here");
}
Da UISlider
eine Unterklasse von UIControl
ist, können Sie ein Ziel und eine Aktion für dessen UIControlEventTouchUpInside
festlegen.
Wenn Sie es im Code tun möchten, sieht es so aus:
[self.slider addTarget:self action:@selector(dragEndedForSlider:)
forControlEvents:UIControlEventTouchUpInside];
Das wird Ihnen eine dragEndedForSlider:
Nachricht senden, wenn die Berührung endet.
Wenn Sie dies in Ihrer Schreibfeder tun möchten, können Sie bei gedrückter Ctrl-Taste auf den Schieberegler klicken, um das Verbindungsmenü aufzurufen, und dann vom Sockel „Touch Up Inside“ auf das Zielobjekt ziehen.
Sie sollten auch ein Ziel und eine Aktion für UIControlEventTouchUpOutside
und für UIControlEventTouchCancel
hinzufügen.
Ziel für touchUpInside
und touchUpOutside
Ereignisse hinzufügen. Sie können dies entweder programmgesteuert oder über das Storyboard tun. So machen Sie es programmatisch
slider.addTarget(self, action: #selector(sliderDidEndSliding), for: [.touchUpInside, .touchUpOutside])
Schreiben Sie Ihre Funktion, um das Ende des Schiebereglers zu behandeln
func sliderDidEndSliding() {
print("end sliding")
}
Sie können verwenden:
- (void)addTarget:(id)target action:(SEL)action
forControlEvents:(UIControlEvents)controlEvents
um zu erkennen, wann die Ereignisse touchDown und touchUp in UISlider auftreten
Ich denke, Sie brauchen das Kontrollereignis UIControlEventTouchUpInside
.
Manchmal möchten Sie, dass die Ziehereignisse des Schiebereglers kontinuierlich ausgelöst werden, haben jedoch die Möglichkeit, unterschiedlichen Code auszuführen, je nachdem, ob der Schieberegler noch gezogen wird oder gerade fertig gezogen wurde.
Zu diesem Zweck habe ich Andys Antwort weiter oben erweitert, die die isTracking
-Eigenschaft des Schiebereglers verwendet. Ich musste zwei Zustände aufzeichnen: sliderHasFinishedTracking
und sliderLastStoredValue
.
Mein Code richtig:
löst beim Starten des Ziehens keine Aktion aus
löst die Aktion aus, wenn der Benutzer den Schieberegler nur mit einem einzigen Antippen bewegt (dh, isTracking
bleibt false
)
class SliderExample: UIViewController {
var slider: UISlider = UISlider()
var sliderHasFinishedTracking: Bool = true
var sliderLastStoredValue: Float!
override func loadView() {
super.loadView()
slider.minimumValue = 100.0
slider.maximumValue = 200.0
slider.isContinuous = true
slider.value = 100.0
self.sliderLastStoredValue = slider.value
slider.addTarget(self, action: #selector(respondToSlideEvents), for: .valueChanged)
// add your slider to the view however you like
}
func respondToSlideEvents(sender: UISlider) {
let currentValue: Float = Float(sender.value)
print("Event fired. Current value for slider: \(currentValue)%.")
if(slider.isTracking) {
self.sliderHasFinishedTracking = false
print("Action while the slider is being dragged ⏳")
} else {
if(self.sliderHasFinishedTracking && currentValue == self.sliderLastStoredValue){
print("Slider has finished tracking and its value hasn't changed, " +
"yet event was fired anyway. ????") // No need to take action.
} else {
self.sliderHasFinishedTracking = true
print("Action upon slider drag/tap finishing ⌛️")
}
}
self.sliderLastStoredValue = currentValue
}
}
In Swift 4 können Sie diese Funktion verwenden
1 Erster Schritt: - Hinzufügen des Ziels im Schieberegler
self.distanceSlider.addTarget(self, action: #selector(self.sliderDidEndSliding(notification:)), for: ([.touchUpInside,.touchUpOutside]))
2 Zweiter Schritt: - Erstellen Sie eine Funktion
@objc func sliderDidEndSliding(notification: NSNotification)
{
print("Hello-->\(distanceSlider.value)")
}
Schnelle 3 Antwort
Ich hatte das gleiche Problem und habe es irgendwann zum Laufen gebracht. Vielleicht hilft es jemandem. Verbinde your_Slider mit 'Value Changed' im Storyboard und wenn der Slider bewegt wird, wird "Slider Touched" aktiviert und wenn losgelassen "Slider Released".
@IBAction func your_Slider(_ sender: UISlider) {
if (yourSlider.isTracking) {
print("Slider Touched")
} else {
print("Slider Released")
}
}
Möglicherweise sollten Sie ein Ziel für UIControlEventTouchUpInside 、 UIControlEventTouchUpOutside 、 UIControlEventTouchCancel-Ereignisse hinzufügen.
Ich bin auf dasselbe Problem gestoßen, da ich kein Ziel für das IControlEventTouchCancel -Ereignis hinzufüge.
Ich hatte vor kurzem ein ähnliches Problem. Folgendes habe ich in Swift gemacht:
theSlider.continuous = false;
Der Code, der diesen fortlaufenden Wert enthält, lautet:
public var continuous: Bool // if set, value change events are generated
// any time the value changes due to dragging. default = YES
Die Standardeinstellung scheint JA (wahr) zu sein. Wenn Sie den Wert auf false setzen, wird das gewünschte Ergebnis erzielt.
Versuchen Sie es so
customSlider.minimumValue = 0.0;
customSlider.maximumValue = 10.0;
[customSlider addTarget:self action:@selector(changeSlider:) forControlEvents:UIControlEventValueChanged];
-(void)changeSlider:(id)sender{
UISlider *slider=(UISlider *)sender;
float sliderValue=(float)(slider.value );
NSLog(@"sliderValue = %f",sliderValue);
}