web-dev-qa-db-fra.com

iPhone: Comment détecter la fin du glissement du curseur?

Comment détecter l'événement lorsque l'utilisateur a terminé le glissement d'un pointeur de curseur?

79
DroidHeaven

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.

147
Rok Jarc

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.

81
pinch

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");
}
69
thomas

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.

16
rob mayoff

Swift 5 et Swift 4

  1. 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])
    
  2. Ecrivez votre fonction pour gérer la fin du glissement du curseur

    func sliderDidEndSliding() {
        print("end sliding")
    }
    
13
Guy Daher

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

10
Mudit Bajpai

Je pense que vous avez besoin de l’événement de contrôle UIControlEventTouchUpInside .

7
scorpiozj

Swift 3.1

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
  }
}
4
Jamie Birch

Relier Touch Up Inside et Value Changed

enter image description here

4
Abo3atef

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)")
}
4
pansora abhay

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")
    }
}
4
Andy

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.

1
zhuoming

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.

1
Evdzhan Mustafa

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);
}
0
Raj Subbiah