Dies ist die beste Antwort auf diese Frage. Ich wünschte, wir könnten die Antwort darauf ändern.
M. Porooshani
1
i.imgur.com/0Edd2xe.png?1 XCode Version 6.x verfügt über diese Funktion zum Festlegen von setContinuous über die IDE selbst.
Abhijeet
1
Ja, die beste Antwort ist dies.
Sabiland
1
Xcode 7.3 Interface Builder hat Events [x] Continuous UpdatesEinstellungen für UISliderView. Wenn Sie dieses Kontrollkästchen deaktivieren continuous, wird false / NO festgelegt.
Leanne
3
Gute Antwort. Hier ist der Swift 4 Code:self.mySlider.isContinuous = false
Marco Weber
113
Sie können für UIControlEventValueChanged eine Aktion hinzufügen, die zwei Parameter akzeptiert: Absender und Ereignis:
Beachten Sie, dass Sie im Interface Builder beim Hinzufügen einer Aktion auch die Option haben, der Aktion sowohl Absender- als auch Ereignisparameter hinzuzufügen.
Funktioniert perfekt! Woher hast du die Quelle dafür?
Roi Mulia
2
danke @RoiMulia, ich erinnere mich nicht, wo ich es zum ersten Mal gesehen habe, ich benutze es seit Jahren in Schiebereglern. Ich benutze es manchmal, um die Änderung an UITouchPhaseEnded zu ignorieren, da der Wert dazu neigt, zu springen, wenn der Benutzer seinen Finger hebt.
Devin Pitcher
2
Denken Sie daran, isContinuous = truein Ihrem zu setzen UISlider.
krlbsk
2
Dies ist eine großartige Lösung, es gibt jedoch ein Problem mit dem Abbrechen von Berührungen. Obwohl in der touchEvent-Enumeration ein "abgebrochenes" Ereignis vorhanden ist, wird es nicht ausgelöst, wenn die Berührung abgebrochen wird. Daher empfehle ich, auch einen Listener für das touchCancel-Ereignis über den Slider hinzuzufügen. Dies sollte alle Möglichkeiten abdecken.
Bnussey
2
Ich habe gesehen, dass manchmal die Phase verlaufen kann: begonnen, stationär, bewegt, aber dann nie beendet oder abgebrochen. Dies ist für meinen Anwendungsfall problematisch, da ich erwartet habe, dass jede Interaktion beendet oder abgebrochen wird. Das Update wurde oben erwähnt: Verwenden Sie ein separates Ziel / eine Aktion zum Abbrechen von Berührungen.
Jordan H
71
Ich verwende die Benachrichtigungen "Touch Up Inside" und "Touch Up Outside".
Interface Builder:
Verbinden Sie beide Benachrichtigungen im Interface Builder mit Ihrer Empfangsmethode. Die Methode könnte folgendermaßen aussehen:
-(IBAction)lengthSliderDidEndSliding:(id)sender {NSLog(@"Slider did end sliding... Do your stuff here");}
In Code:
Wenn Sie es programmgesteuert verkabeln möchten, haben Sie so etwas in Ihrem viewWillAppear-Aufruf (oder wo immer es Ihnen passt):
Das wird Ihnen eine dragEndedForSlider:Nachricht senden, wenn die Berührung endet.
Wenn Sie dies in Ihrer Feder tun möchten, können Sie bei gedrückter Ctrl-Taste auf Ihren Schieberegler klicken, um das Verbindungsmenü aufzurufen, und dann vom Sockel „Touch Up Inside“ zum Zielobjekt ziehen.
Sie sollten auch ein Ziel und eine Aktion für UIControlEventTouchUpOutsideund für hinzufügen UIControlEventTouchCancel.
@rob mayoff Entschuldigung, aber Sie müssen UIControlEventTouchUpOutside verwenden. Andernfalls wird der Selektor nicht aufgerufen, wenn sich Ihr Finger nach dem Ziehen nicht auf dem Schieberegler befindet.
user3164248
2
Das Verhalten von UISliderhat sich geändert, seit ich diese Antwort geschrieben habe.
Rob Mayoff
Kann bestätigen , dass Sie es auch brauchen , um einen Handler für UIControlEventTouchUpOutside in iOS registrieren 9.
lms
Ich war nie aufrufen können UIControlEventTouchCancel9. in iOS - Handler Aber ich bin in der Lage zu berufen UIControlEventTouchUpInsideund UIControlEventTouchUpOutsidenur.
Petrsyn
16
Swift 5 und Swift 4
Ziel für touchUpInsideund touchUpOutsideEreignisse hinzufügen. Sie können dies entweder programmgesteuert oder über das Storyboard tun. So machen Sie es programmatisch
Ich hatte das gleiche Problem und brachte es schließlich zum Laufen, also hilft es vielleicht jemandem. Verbinden Sie Ihren_Slider mit 'Wert geändert' im Storyboard und wenn der Schieberegler bewegt wird, wird "Schieberegler berührt" aktiviert und wenn "Schieberegler freigegeben" losgelassen wird.
Manchmal möchten Sie, dass die Drag-Ereignisse des Schiebereglers kontinuierlich ausgelöst werden, haben jedoch die Möglichkeit, unterschiedlichen Code auszuführen, je nachdem, ob der Slider noch gezogen wird oder gerade nicht mehr gezogen wurde.
Zu diesem Zweck habe ich die obige Antwort von Andy erweitert, die die isTrackingEigenschaft des Schiebereglers nutzt . Ich musste zwei Zustände aufzeichnen: sliderHasFinishedTrackingund 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 Tastendruck anstößt (was bedeutet, dass dies isTrackingverbleibt false).
classSliderExample:UIViewController{var slider:UISlider=UISlider()var sliderHasFinishedTracking:Bool=truevar sliderLastStoredValue:Float!override func loadView(){super.loadView()
slider.minimumValue =100.0
slider.maximumValue =200.0
slider.isContinuous =true
slider.value=100.0self.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 =falseprint("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 =trueprint("Action upon slider drag/tap finishing ⌛️")}}self.sliderLastStoredValue = currentValue
}}
Erstellen Sie eine Aktion und einen Ausgang für den Schieberegler (oder geben Sie den Absender von der Aktion in UISlider ein), und deaktivieren Sie in der Benutzeroberfläche das Kontrollkästchen Kontinuierliche Updates. Auf diese Weise erhalten wir den Schiebereglerwert nur, wenn der Schieberegler nicht mehr gezogen wird.
Antworten:
Wenn Sie zwischen dem Ziehen keine Daten benötigen, sollten Sie einfach Folgendes festlegen:
Auf diese Weise erhalten Sie nur dann ein
valueChanged
Ereignis, wenn der Benutzer den Schieberegler nicht mehr bewegt.Swift 5 Version:
quelle
Events [x] Continuous Updates
Einstellungen für UISliderView. Wenn Sie dieses Kontrollkästchen deaktivierencontinuous
, wird false / NO festgelegt.self.mySlider.isContinuous = false
Sie können für UIControlEventValueChanged eine Aktion hinzufügen, die zwei Parameter akzeptiert: Absender und Ereignis:
Überprüfen Sie dann die Phase des Touch-Objekts in Ihrem Handler:
Schnelle 4 & 5
Beachten Sie, dass Sie im Interface Builder beim Hinzufügen einer Aktion auch die Option haben, der Aktion sowohl Absender- als auch Ereignisparameter hinzuzufügen.
quelle
isContinuous = true
in Ihrem zu setzenUISlider
.Ich verwende die Benachrichtigungen "Touch Up Inside" und "Touch Up Outside".
Interface Builder:
Verbinden Sie beide Benachrichtigungen im Interface Builder mit Ihrer Empfangsmethode. Die Methode könnte folgendermaßen aussehen:
In Code:
Wenn Sie es programmgesteuert verkabeln möchten, haben Sie so etwas in Ihrem viewWillAppear-Aufruf (oder wo immer es Ihnen passt):
Die Empfangsmethode würde folgendermaßen aussehen:
quelle
Da
UISlider
es sich um eine Unterklasse von handeltUIControl
, können Sie ein Ziel und eine Aktion für seine festlegenUIControlEventTouchUpInside
.Wenn Sie es in Code tun möchten, sieht es so aus:
Das wird Ihnen eine
dragEndedForSlider:
Nachricht senden, wenn die Berührung endet.Wenn Sie dies in Ihrer Feder tun möchten, können Sie bei gedrückter Ctrl-Taste auf Ihren Schieberegler klicken, um das Verbindungsmenü aufzurufen, und dann vom Sockel „Touch Up Inside“ zum Zielobjekt ziehen.
Sie sollten auch ein Ziel und eine Aktion für
UIControlEventTouchUpOutside
und für hinzufügenUIControlEventTouchCancel
.quelle
UISlider
hat sich geändert, seit ich diese Antwort geschrieben habe.UIControlEventTouchCancel
9. in iOS - Handler Aber ich bin in der Lage zu berufenUIControlEventTouchUpInside
undUIControlEventTouchUpOutside
nur.Swift 5 und Swift 4
Ziel für
touchUpInside
undtouchUpOutside
Ereignisse hinzufügen. Sie können dies entweder programmgesteuert oder über das Storyboard tun. So machen Sie es programmatischSchreiben Sie Ihre Funktion, um das Ende des Schiebereglers zu bewältigen
quelle
Sie können verwenden:
um zu erkennen, wann die Ereignisse touchDown und touchUp in UISlider auftreten
quelle
Ich denke, Sie brauchen das Kontrollereignis
UIControlEventTouchUpInside
.quelle
Schnelle 3 Antwort
Ich hatte das gleiche Problem und brachte es schließlich zum Laufen, also hilft es vielleicht jemandem. Verbinden Sie Ihren_Slider mit 'Wert geändert' im Storyboard und wenn der Schieberegler bewegt wird, wird "Schieberegler berührt" aktiviert und wenn "Schieberegler freigegeben" losgelassen wird.
quelle
Verbinden
Touch Up Inside
undValue Changed
quelle
Swift 3.1
Manchmal möchten Sie, dass die Drag-Ereignisse des Schiebereglers kontinuierlich ausgelöst werden, haben jedoch die Möglichkeit, unterschiedlichen Code auszuführen, je nachdem, ob der Slider noch gezogen wird oder gerade nicht mehr gezogen wurde.
Zu diesem Zweck habe ich die obige Antwort von Andy erweitert, die die
isTracking
Eigenschaft des Schiebereglers nutzt . Ich musste zwei Zustände aufzeichnen:sliderHasFinishedTracking
undsliderLastStoredValue
.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 Tastendruck anstößt (was bedeutet, dass dies
isTracking
verbleibtfalse
).quelle
In Swift 4 können Sie diese Funktion verwenden
1 Frist-Schritt: - Hinzufügen des Ziels im Schieberegler
2 Zweiter Schritt: - Erstellen Sie eine Funktion
quelle
Möglicherweise sollten Sie ein Ziel für UIControlEventTouchUpInside 、 UIControlEventTouchUpOutside 、 UIControlEventTouchCancel-Ereignisse hinzufügen.
Ich bin zuvor auf dasselbe Problem gestoßen , weil ich kein Ziel für das UIControlEventTouchCancel- Ereignis hinzugefügt habe .
quelle
Ich hatte kürzlich ein ähnliches Problem. Folgendes habe ich in Swift getan:
Der Code, der diesen fortlaufenden Wert enthält, lautet:
Der Standardwert scheint JA (wahr) zu sein. Wenn Sie es auf false setzen, tun Sie genau das, was Sie wollen.
quelle
Versuchen Sie es so
quelle
RxSwift:
quelle
Erstellen Sie eine Aktion und einen Ausgang für den Schieberegler (oder geben Sie den Absender von der Aktion in UISlider ein), und deaktivieren Sie in der Benutzeroberfläche das Kontrollkästchen Kontinuierliche Updates. Auf diese Weise erhalten wir den Schiebereglerwert nur, wenn der Schieberegler nicht mehr gezogen wird.
quelle