2009-09-08 5 views
1

je peux détecter simple/double-tap dans des vues spécifiques avec:Détecter deux fois sur UISlider?

NSSet *myTouches = [event touchesForView:mySpecificView.view]; 

mais je veux détecter une double pression sur le bouton d'un curseur et ne peut trouver aucune référence. Existe-t-il un remplacement de "touchesForView:" où je peux entrer le nom de mon curseur? Utilisation: J'ai trois curseurs avec leur valeur par défaut étant directement au centre du curseur. Une fois que la position du curseur a changé, je veux un moyen rapide de réinitialiser individuellement chaque curseur à sa position par défaut.

J'ai actuellement l'affichage contenant chaque curseur pour répondre à un double-tap, mise à jour chaque curseur. Cela fonctionne bien, mais ne semble pas naturel. C'est-à-dire que je ne peux pas appuyer deux fois sur le curseur car le curseur intercepte les prises et ne les transmet pas à la vue environnante.

grâce à l'avance

+0

* bosse * Soit c'est quelque chose que personne n'a fait/veut faire, ou il est si simple tout le monde suppose que je trébuche ac ross it. De toute façon, je suis toujours coincé. N'importe qui? – Randy

Répondre

1

En utilisant deux méthodes, en connectant l'événement TouchDownRepeat d'un curseur à un (doubleTapSlider) et à l'événement TouchUpInside du même curseur à un autre (releaseSliderBtn), j'ai pu obtenir la fonctionnalité exacte que je recherchais. J'avais besoin de ceci pour trois curseurs séparés, donc je leur ai assigné des balises de 5, 6 & 7 dans Interface Builder pour détecter lequel appelait mes méthodes. L'utilisateur tape deux fois une bille qui ramène la bille vers le centre et définit l'étiquette sur 100. Si je n'avais pas la méthode releaseSliderBtn, quand l'utilisateur relâchait le deuxième appui, l'étiquette restait à 100, mais la balle reviendrait à l'endroit où l'utilisateur a relâché le deuxième appui. Maintenant, en vérifiant le texte actuel de l'étiquette, lorsque l'utilisateur relâche le deuxième appui, la balle reste à l'emplacement central. La gamme du Slider 1 est de 50 ~ 150. La plage du Slider 2 est de -12 ~ + 12. La plage du Slider 3 est de -49 ~ + 49.

FYI: Pour une raison quelconque, 'else if' ne fonctionnait pas pour releaseSliderBtn, c'est pourquoi je leur ai fait trois instructions if distinctes.

-(IBAction)doubleTapSlider:(id)sender { 
    printf ("Sender: %d\n", [sender tag]); 
    if([sender tag] == 5){ 
    playbackSpeedSlider.value = 100; 
    playbackSpeedLabel.text = @"100"; 
    } else if ([sender tag] == 6) { 
    halfStepSlider.value = 0; 
    halfStepLabel.text = @"0"; 
    } else if ([sender tag] == 7) { 
    centsSlider.value = 0; 
    centsLabel.text = @"0"; 
    } 
} 
-(IBAction)releaseSliderBtn:(id)sender { 
    printf ("Sender: %d\n", [sender tag]); 
    if([sender tag] == 5){ 
    if(playbackSpeedLabel.text == @"100"){ 
     playbackSpeedSlider.value = 100; 
    } 
    } 
    if ([sender tag] == 6) { 
    if(halfStepLabel.text == @"0"){ 
     halfStepSlider.value = 0; 
    } 
    } 
    if ([sender tag] == 7) { 
    if(centsLabel.text == @"0"){ 
     centsSlider.value = 0; 
    } 
    } 
} 
+0

Des trucs géniaux. Merci! – Luke

0

que je cherchais un moyen de passer les événements tactiles d'un UISlider à un UITableView quand je suis tombé sur votre question.

Si vous ne l'avez pas par maintenant, ou pour quelqu'un d'autre avec une question similaire, vous pouvez détecter un double tap sur un objet UISlider en définissant une méthode d'action à elle comme ceci:

- (void)loadView { 

    UISlider *slider = [[UISlider alloc] initWithFrame:sliderBackground.frame]; 
    [view addSubview:slider]; 

    // Set the slider action method 
    [slider addTarget:self 
      action:@selector(sliderDoubleTap:) 
      forControlEvents:UIControlEventTouchDownRepeat]; 

} 


- (void) sliderDoubleTap: (UISlider *) sender { 
    NSLog(@"Slider Double Tap"); 
} 
+0

Merci pour la suggestion user211790, mais cela n'a pas tout à fait le faire. J'étais déjà capable de faire glisser de l'événement TouchDownRepeat du curseur vers une méthode dans Interface Builder, ce qui m'a permis de définir à la fois le curseur et l'étiquette du curseur (un UILabel) sur "100". Le problème était, dès que j'ai relâché ce deuxième tap, le curseur revenait à l'endroit où mon doigt avait tapé deux fois. c'est-à-dire "50" etc. J'ai été capable de le comprendre avec deux méthodes, voir ci-dessous. – Randy

0

Mise à jour pour Swift 3.0

Ceci est une vieille question que je suis tombé sur tout en résolvant un problème presque identique d'ajouter un double tap pour réinitialiser un reconnaisseur curseur. La réponse originale nous dirige dans la bonne direction en ajoutant une action pour répondre à UIControlEvents.touchDownRepeat.

Cela peut être fait en rapide en ajoutant la ligne dans votre contrôleur de vue (par exemple dans la méthode viewDidLoad():

override func viewDidLoad() 
{  
    super.viewDidLoad() 
    self.slider.addTarget(self, action: #selector(sliderTouchDownRepeat(_ :)), for: .touchDownRepeat) 
} 

Et vous pouvez y répondre en conséquence dans le sélecteur:

@objc func sliderTouchDownRepeat(_ slider: UISlider) 
{  
     //Respond to double tap here 
} 

Cette Tout va bien, bien qu'il y ait quelques morceaux de code supplémentaires qui sont nécessaires si vous envisagez de changer la valeur du curseur lorsque le double tap est reconnu

Tout d'abord, ajoutez également une action pour la UIControlEvents.valueChanged

override func viewDidLoad() 
{  
    super.viewDidLoad() 
    self.slider.addTarget(self, action: #selector(sliderTouchDownRepeat(_ :)), for: .touchDownRepeat) 
    self.slider.addTarget(self, action: #selector(sliderDidChange(_:)), for: .valueChanged) 
} 

Annuler l'événement touche actuelle vers le bas que nous répondons à de telle sorte que le pouce du curseur est pas immédiatement retourné au double robinet emplacement slider.cancelTracking(with: nil) et appeler l'action le UIControlEvents.valueChanged

@objc func sliderTouchDownRepeat(_ slider: UISlider) 
{ 
    slider.cancelTracking(with: nil) 

    // Perform your own value change operation 
    // self.reset() 

    self.sliderDidChange(slider) 
} 

@objc func sliderDidChange(_ slider: UISlider) 
{ 
    //Update any other UI here 
} 

Bonne codage