C'est la meilleure réponse à cette question. Je souhaite que nous puissions changer la réponse à cela.
M. Porooshani
1
i.imgur.com/0Edd2xe.png?1 La version 6.x de XCode a cette fonction de paramétrer setContinuous via l'IDE lui-même.
Abhijeet le
1
Oui, la meilleure réponse est celle-ci.
sabiland
1
Xcode 7.3 Interface Builder a des Events [x] Continuous Updatesparamètres pour UISliderView. Décocher cette option est définie continuoussur false / NO.
leanne
3
Très bonne réponse. Voici le code Swift 4:self.mySlider.isContinuous = false
Marco Weber
115
Vous pouvez ajouter une action qui prend deux paramètres, l'expéditeur et un événement, pour UIControlEventValueChanged:
Remarque dans Interface Builder lors de l'ajout d'une action, vous avez également la possibilité d'ajouter à la fois des paramètres d'expéditeur et d'événement à l'action.
Fonctionne parfaitement! Où en avez-vous trouvé la source?
Roi Mulia
2
merci @RoiMulia, je ne me souviens pas où je l'ai vu pour la première fois, j'utilise des curseurs depuis des années. Je l'utilise parfois pour ignorer le changement sur UITouchPhaseEnded car la valeur a tendance à sauter lorsque l'utilisateur lève le doigt.
Devin Pitcher
2
N'oubliez pas de définir isContinuous = truevotre UISlider.
krlbsk
2
C'est une excellente solution, mais il y a un problème avec l'annulation tactile. Bien qu'il y ait un événement "annulé" dans l'énumération touchEvent, il n'est pas déclenché lorsque le toucher est annulé. Par conséquent, je recommande également d'ajouter un écouteur pour l'événement touchCancel à partir du curseur. Cela devrait couvrir toutes les possibilités.
bnussey
2
J'ai vu que parfois la phase peut aller: commencée, stationnaire, déplacée, mais ensuite jamais terminée ni annulée. C'est problématique pour mon cas d'utilisation car je m'attendais à ce que chaque interaction se termine ou soit annulée. Le correctif est noté ci-dessus: utilisez une cible / action d'annulation tactile distincte.
Jordan H le
71
J'utilise les notifications «Retouche à l'intérieur» et «Retouche à l'extérieur».
Constructeur d'interface:
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 du code:
Si vous voulez le câbler par programme, vous auriez quelque chose comme ça dans votre viewWillAppear (ou partout où cela vous convient) appelez:
Cela vous enverra un dragEndedForSlider: message lorsque le toucher se terminera.
Si vous voulez le faire dans votre plume, vous pouvez contrôler-cliquez sur votre curseur pour obtenir son menu de connexions, puis faites-le glisser de la prise «Retouche à l'intérieur» vers l'objet cible.
Vous devez également ajouter une cible et une action pour UIControlEventTouchUpOutsideet pour UIControlEventTouchCancel.
@rob mayoff Désolé mais vous devez utiliser UIControlEventTouchUpOutside. Sinon, le sélecteur ne sera pas appelé si votre doigt n'est pas sur le curseur lorsque vous avez terminé de faire glisser.
user3164248
2
Le comportement de UISlidera changé depuis que j'ai écrit cette réponse.
rob mayoff
Peut confirmer que vous avez besoin d'enregistrer également un gestionnaire pour UIControlEventTouchUpOutside dans iOS 9.
lms
Je n'ai jamais pu invoquer le UIControlEventTouchCancelgestionnaire dans iOS 9. Mais je suis capable de l'invoquer UIControlEventTouchUpInsideet UIControlEventTouchUpOutsideuniquement.
petrsyn le
17
Swift 5 et Swift 4
Ajoutez une cible pour touchUpInsideet des touchUpOutsideévénements. Vous pouvez le faire soit par programme, soit à partir du storyboard. Voici comment vous procédez par programme
J'ai eu le même problème et j'ai finalement réussi à faire fonctionner cela, alors peut-être que cela aidera quelqu'un. Connectez your_Slider à 'Value Changed' dans le storyboard et lorsque le curseur a bougé "Slider Touched" actionné et quand relâchez "Slider Released".
Parfois, vous souhaiterez que les événements de glissement du curseur se déclenchent en continu, mais vous avez la possibilité d'exécuter un code différent selon que le curseur est toujours en cours de déplacement ou qu'il vient de finir de le faire.
Pour ce faire, j'ai développé la réponse d'Andy ci-dessus qui utilise la isTrackingpropriété du curseur . J'avais besoin d'enregistrer deux états: sliderHasFinishedTrackingetsliderLastStoredValue .
Mon code correctement:
ne déclenche pas d'action au début de la traînée
déclenche l'action si l'utilisateur ne déplace le curseur que d'un seul clic (ce qui signifie qu'il isTrackingreste 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
}}
Créez une action et une sortie pour le curseur (ou vous pouvez taper l'expéditeur de l'action vers UISlider), et dans l'interface utilisateur, décochez la case Mises à jour continues. De cette façon, nous obtiendrons la valeur du curseur uniquement lorsque le curseur cesse de glisser.
Réponses:
Si vous n'avez pas besoin de données entre les glissements, vous devez simplement définir:
De cette façon, vous recevrez un
valueChanged
événement uniquement lorsque l'utilisateur arrête de déplacer le curseur.Version Swift 5 :
la source
Events [x] Continuous Updates
paramètres pour UISliderView. Décocher cette option est définiecontinuous
sur false / NO.self.mySlider.isContinuous = false
Vous pouvez ajouter une action qui prend deux paramètres, l'expéditeur et un événement, pour UIControlEventValueChanged:
Vérifiez ensuite la phase de l'objet tactile dans votre gestionnaire:
Swift 4 et 5
Remarque dans Interface Builder lors de l'ajout d'une action, vous avez également la possibilité d'ajouter à la fois des paramètres d'expéditeur et d'événement à l'action.
la source
isContinuous = true
votreUISlider
.J'utilise les notifications «Retouche à l'intérieur» et «Retouche à l'extérieur».
Constructeur d'interface:
Connectez les deux notifications dans Interface Builder à votre méthode de réception. La méthode pourrait ressembler à ceci:
Dans du code:
Si vous voulez le câbler par programme, vous auriez quelque chose comme ça dans votre viewWillAppear (ou partout où cela vous convient) appelez:
La méthode de réception ressemblerait à ceci:
la source
Puisqu'il
UISlider
s'agit d'une sous-classe deUIControl
, vous pouvez définir une cible et une action pour sonUIControlEventTouchUpInside
.Si vous voulez le faire dans le code, cela ressemble à ceci:
Cela vous enverra un
dragEndedForSlider:
message lorsque le toucher se terminera.Si vous voulez le faire dans votre plume, vous pouvez contrôler-cliquez sur votre curseur pour obtenir son menu de connexions, puis faites-le glisser de la prise «Retouche à l'intérieur» vers l'objet cible.
Vous devez également ajouter une cible et une action pour
UIControlEventTouchUpOutside
et pourUIControlEventTouchCancel
.la source
UISlider
a changé depuis que j'ai écrit cette réponse.UIControlEventTouchCancel
gestionnaire dans iOS 9. Mais je suis capable de l'invoquerUIControlEventTouchUpInside
etUIControlEventTouchUpOutside
uniquement.Swift 5 et Swift 4
Ajoutez une cible pour
touchUpInside
et destouchUpOutside
événements. Vous pouvez le faire soit par programme, soit à partir du storyboard. Voici comment vous procédez par programmeÉcrivez votre fonction pour gérer la fin du glissement du curseur
la source
Vous pouvez utiliser:
pour détecter quand les événements touchDown et touchUp se produisent dans UISlider
la source
Je pense que vous avez besoin de l'événement de contrôle
UIControlEventTouchUpInside
.la source
Réponse Swift 3
J'ai eu le même problème et j'ai finalement réussi à faire fonctionner cela, alors peut-être que cela aidera quelqu'un. Connectez your_Slider à 'Value Changed' dans le storyboard et lorsque le curseur a bougé "Slider Touched" actionné et quand relâchez "Slider Released".
la source
Connectez
Touch Up Inside
etValue Changed
la source
Swift 3.1
Parfois, vous souhaiterez que les événements de glissement du curseur se déclenchent en continu, mais vous avez la possibilité d'exécuter un code différent selon que le curseur est toujours en cours de déplacement ou qu'il vient de finir de le faire.
Pour ce faire, j'ai développé la réponse d'Andy ci-dessus qui utilise la
isTracking
propriété du curseur . J'avais besoin d'enregistrer deux états:sliderHasFinishedTracking
etsliderLastStoredValue
.Mon code correctement:
ne déclenche pas d'action au début de la traînée
déclenche l'action si l'utilisateur ne déplace le curseur que d'un seul clic (ce qui signifie qu'il
isTracking
restefalse
)la source
Dans Swift 4, vous pouvez utiliser cette fonction
1 Première étape: - Ajout de la cible dans le curseur
2 Deuxième étape: - Créer une fonction
la source
Vous devriez peut-être ajouter une cible pour les événements UIControlEventTouchUpInside 、 UIControlEventTouchUpOutside 、 UIControlEventTouchCancel.
J'ai rencontré le même problème avant, car je n'ajoute pas de cible pour l' événement UIControlEventTouchCancel .
la source
J'ai eu un problème similaire récemment. Voici ce que j'ai fait dans Swift:
Le code qui contient cette valeur continue lit:
La valeur par défaut semble être OUI (vrai). Le définir sur false fait ce que vous voulez.
la source
Essayez comme ça
la source
RxSwift:
la source
Créez une action et une sortie pour le curseur (ou vous pouvez taper l'expéditeur de l'action vers UISlider), et dans l'interface utilisateur, décochez la case Mises à jour continues. De cette façon, nous obtiendrons la valeur du curseur uniquement lorsque le curseur cesse de glisser.
la source