Comment détecter l'événement lorsque l'utilisateur a terminé le glissement d'un pointeur de curseur?
Si vous n'avez pas besoin de données entre les glissades, définissez simplement:
[mySlider setContinuous: NO];
De cette façon, vous ne recevrez l'événement valueChanged
que lorsque l'utilisateur arrêtera de déplacer le curseur.
Vous pouvez ajouter une action qui prend deux paramètres, l'expéditeur et un événement, pour UIControlEventValueChanged:
[slider addTarget:self action:@selector(onSliderValChanged:forEvent:) forControlEvents:UIControlEventValueChanged]
Puis vérifiez la phase de l’objet tactile dans votre gestionnaire:
- (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;
}
}
Swift 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
}
}
}
Remarque dans Interface Builder lors de l'ajout d'une action, vous avez également la possibilité d'ajouter à la fois les paramètres d'expéditeur et d'événement.
J'utilise les notifications "Retouche à l'intérieur" et "Retouche à l'extérieur".
Interface Builder:
Connectez les deux notifications dans Interface Builder à votre méthode de réception. La méthode pourrait ressembler à ceci:
- (IBAction)lengthSliderDidEndSliding:(id)sender {
NSLog(@"Slider did end sliding... Do your stuff here");
}
Dans le code:
Si vous souhaitez le câbler par programme, vous aurez quelque chose comme ceci dans votre vue, à paraître (ou à votre convenance), appelez:
[_mySlider addTarget:self
action:@selector(sliderDidEndSliding:)
forControlEvents:(UIControlEventTouchUpInside | UIControlEventTouchUpOutside)];
La méthode de réception ressemblerait à ceci:
- (void)sliderDidEndSliding:(NSNotification *)notification {
NSLog(@"Slider did end sliding... Do your stuff here");
}
Puisque UISlider
est une sous-classe de UIControl
, vous pouvez définir une cible et une action pour sa UIControlEventTouchUpInside
.
Si vous voulez le faire en code, cela ressemble à ceci:
[self.slider addTarget:self action:@selector(dragEndedForSlider:)
forControlEvents:UIControlEventTouchUpInside];
Cela vous enverra un dragEndedForSlider:
message lorsque le contact se termine.
Si vous souhaitez le faire dans votre nib, vous pouvez tout en maintenant la souris enfoncée tout en maintenant la touche Ctrl enfoncée pour afficher le menu des connexions, puis faites-la glisser de la prise de retouche à l'intérieur de l'objet cible.
Vous devez également ajouter une cible et une action pour UIControlEventTouchUpOutside
et pour UIControlEventTouchCancel
.
Ajouter une cible pour les événements touchUpInside
et touchUpOutside
. Vous pouvez le faire soit par programmation, soit à partir d'un scénario. Voici comment vous le faites par programme
slider.addTarget(self, action: #selector(sliderDidEndSliding), for: [.touchUpInside, .touchUpOutside])
Ecrivez votre fonction pour gérer la fin du glissement du curseur
func sliderDidEndSliding() {
print("end sliding")
}
Vous pouvez utiliser:
- (void)addTarget:(id)target action:(SEL)action
forControlEvents:(UIControlEvents)controlEvents
détecter quand les événements touchDown et touchUp se produisent dans UISlider
Je pense que vous avez besoin de l’événement de contrôle UIControlEventTouchUpInside
.
Parfois, vous souhaiterez que les événements de glissement du curseur se déclenchent en permanence, tout en ayant la possibilité d'exécuter un code différent selon que le curseur est toujours en train de glisser ou qu'il vient juste de le faire.
Pour ce faire, j'ai développé la réponse d'Andy ci-dessus qui utilise la propriété isTracking
du curseur. Il me fallait enregistrer deux états: sliderHasFinishedTracking
et sliderLastStoredValue
.
Mon code correctement:
ne déclenche pas d'action au démarrage
déclenche l'action si l'utilisateur déplace seulement le curseur avec un seul tap (ce qui signifie que isTracking
reste 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
}
}
Dans Swift 4, vous pouvez utiliser cette fonction
1 Première étape: - Ajouter la cible dans le curseur
self.distanceSlider.addTarget(self, action: #selector(self.sliderDidEndSliding(notification:)), for: ([.touchUpInside,.touchUpOutside]))
2 Deuxième étape: - Créer une fonction
@objc func sliderDidEndSliding(notification: NSNotification)
{
print("Hello-->\(distanceSlider.value)")
}
Réponse rapide 3
J'avais le même problème et j'ai finalement réussi à faire en sorte que cela puisse aider quelqu'un. Connectez votre_Slider à 'Valeur modifiée' dans le storyboard et lorsque le curseur est déplacé, le curseur "Touché au curseur" est activé et lorsqu'il est relâché "Le curseur est relâché".
@IBAction func your_Slider(_ sender: UISlider) {
if (yourSlider.isTracking) {
print("Slider Touched")
} else {
print("Slider Released")
}
}
Vous devriez peut-être ajouter une cible pour les événements UIControlEventTouchUpInside 、 UIControlEventTouchUpOutside UIControlEventTouchCancel.
J'ai déjà rencontré le même problème auparavant, car je n'ajoute pas de cible pour l'événement IControlEventTouchCancel.
J'ai eu le même problème récemment. Voici ce que j'ai fait à Swift:
theSlider.continuous = false;
Le code qui contient cette valeur continue se lit comme suit:
public var continuous: Bool // if set, value change events are generated
// any time the value changes due to dragging. default = YES
La valeur par défaut semble être OUI (vrai). Si vous le définissez sur false, vous faites ce que vous voulez.
Essayez comme ça
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);
}