Comment régler le curseur sur la position cliquée et obtenir la valeur du curseur sur l'emplacement cliqué sur UISlider dans la programmation iPhone. Je sais que nous pouvons faire glisser le curseur vers cette position mais je ne veux pas le faire. Pouvez-vous me s'il vous plaît comment régler le curseur à la position cliquée? Est-ce possible?iPhone: Programmation d'UISlider pour positionner sur l'emplacement cliqué
Répondre
Vous pouvez simplement ajouter un UITapGestureRecognizer au curseur, puis extraire le UIEvent et les Touches associés pour déterminer où le long du curseur UISlider a eu lieu le tap. Définissez ensuite la valeur de votre curseur sur cette valeur calculée.
MISE À JOUR:
D'abord, la configuration de votre curseur et ajouter le geste à lui reconnaisseur.
UISlider *slider = [[[UISlider alloc] init] autorelease];
…
<slider setup>
…
UITapGestureRecognizer *gr = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(sliderTapped:)] autorelease];
[slider addGestureRecognizer:gr];
ensuite mettre en œuvre le sélecteur
- (void)sliderTapped:(UIGestureRecognizer *)gestureRecognizer {
<left as a user excercise*>
}
* Astuce: Read the docs pour savoir comment obtenir le locationInView extrapolé et comprendre ce que le curseur doit être
Voici la partie « gauche comme un exercice utilisateur ":
- (void) tapped: (UITapGestureRecognizer*) g {
UISlider* s = (UISlider*)g.view;
if (s.highlighted)
return; // tap on thumb, let slider deal with it
CGPoint pt = [g locationInView: s];
CGFloat percentage = pt.x/s.bounds.size.width;
CGFloat delta = percentage * (s.maximumValue - s.minimumValue);
CGFloat value = s.minimumValue + delta;
[s setValue:value animated:YES];
}
la façon dont je l'ai fait est de sous-classe la curseur et vérifiez touchesBegan
. Si l'utilisateur tape sur la zone du bouton du pouce (que nous surveillons) puis ignorer le robinet, mais partout ailleurs sur le trackbar nous: :
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchLocation = [touch locationInView:self];
// if we didn't tap on the thumb button then we set the value based on tap location
if (!CGRectContainsPoint(lastKnownThumbRect, touchLocation)) {
self.value = self.minimumValue + (self.maximumValue - self.minimumValue) * (touchLocation.x/self.frame.size.width);
}
[super touchesBegan:touches withEvent:event];
}
- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value {
CGRect thumbRect = [super thumbRectForBounds:bounds trackRect:rect value:value];
lastKnownThumbRect = thumbRect;
return thumbRect;
}
loin meilleure solution –
si vous avez utilisé un custom-setThumbImage, utilisez 'self.value = self.minimumValue + (self.maximumValue - self.minimumValue) * ((touchLocation.x - self.currentThumbImage.size.width/2)/(self.frame.size.width-self.currentThumbImage.size.width)); 'dans -touchesBegan. – SwiftArchitect
j'utilisais le code sous-classé de UISlider pour écouter les événements valueChanged dans ios6> pour implémenter une fonction de type snap-to-grid.
Cela a été interrompu lors de la mise à niveau vers iOS7 car il ne renvoyait plus UIControlEventsValueChanged. Pour toute personne ayant le même problème, il est fixé en ajoutant une ligne dans le cas() comme ci-dessous:
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchLocation = [touch locationInView:self];
// if we didn't tap on the thumb button then we set the value based on tap location
if (!CGRectContainsPoint(lastKnownThumbRect, touchLocation)) {
self.value = self.minimumValue + (self.maximumValue - self.minimumValue) * (touchLocation.x/self.frame.size.width);
[self sendActionsForControlEvents:UIControlEventValueChanged];
}
[super touchesBegan:touches withEvent:event];
}
- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value {
CGRect thumbRect = [super thumbRectForBounds:bounds trackRect:rect value:value];
lastKnownThumbRect = thumbRect;
return thumbRect;
}
aide quelqu'un espère que cela :)
J'ai utilisé ce code. Obtenez de: http://imagineric.ericd.net/2012/11/15/uislider-touch-to-set-value/
UITapGestureRecognizer *gr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(sliderTapped:)];
[slider addGestureRecognizer:gr];
- (void)sliderTapped:(UIGestureRecognizer *)g {
UISlider* s = (UISlider*)g.view;
if (s.highlighted)
return; // tap on thumb, let slider deal with it
CGPoint pt = [g locationInView: s];
CGFloat percentage = pt.x/s.bounds.size.width;
CGFloat delta = percentage * (s.maximumValue - s.minimumValue);
CGFloat value = s.minimumValue + delta;
[s setValue:value animated:YES];
}
espère que cela peut vous aider.
Il semble que le simple fait de sous-classer UISlider et de retourner toujours true au beginTracking produit l'effet désiré.
iOS 10 et Swift 3
class CustomSlider: UISlider {
override func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
return true
}
}
Pouvez-vous donner une idée approximative de la façon d'introduire dans UITapGestureRecognizer curseur? – suse