2010-03-08 9 views
11

J'essaie d'utiliser une vue UIPicker avec un comportement quelque peu différent de ce qui est généralement vu dans les exemples de code iPhone. Ce que je veux faire est de permettre aux utilisateurs de faire défiler le contenu du sélecteur, mais de ne pas sélectionner la ligne d'un sélecteur automatiquement (en utilisant la méthode "didSelectRow" du délégué du sélecteur). Au lieu de cela, je veux permettre à l'utilisateur de toucher la rangée centrale du sélecteur, qui est mise en surbrillance, et devient la sélection.Autoriser l'utilisateur à sélectionner une ligne UIPickerView en appuyant sur

Y a-t-il un moyen d'y parvenir?

Merci d'avance.

+0

Pouvez-vous expliquer pourquoi la méthode didSelectRow ne vous aide pas ici? Avez-vous essayé de l'utiliser et si oui, quel problème avez-vous eu? – DyingCactus

+0

Le problème est que cela fonctionne comme il le suppose. : -/Fondamentalement, j'ai l'air d'un pickerView où le sélecteur a sélectionné automatiquement l'une de ses valeurs de ligne, mais il sélectionne uniquement une valeur lorsque l'utilisateur le touche. J'essayais de faire la même chose mais je ne pouvais pas. – camilo

Répondre

0

Il n'y a que 2 délégués pour UIPickerView.

Ainsi, nous pouvons utiliser seulement 7 méthodes pour contrôler UIPickerView par le délégué.

- pickerView: rowHeightForComponent:
- pickerView: widthForComponent:
- pickerView: titleForRow: forComponent:
- pickerView: viewForRow: forComponent: reusingView:
- pickerView: didSelectRow: inComponent:
- numberOfComponentsInPickerView :
- pickerView: numberOfRowsInComponent:

tout le monde.

Dans UITableViewDelegate case, il existe plusieurs méthodes pour UITableView pour la gestion des sélections. tels que, - tableView: willSelectRowAtIndexPath:
- tableView: didSelectRowAtIndexPath:
- tableView: willDeselectRowAtIndexPath:
- tableView: didDeselectRowAtIndexPath:

Mais ...

En cas UIPickerViewDelegate, il est seulement 1 méthode pour répondre à la sélection de ligne.

- pickerView: didSelectRow: inComponent:

+0

c'est ce que je pensais. J'ai vu des applications faire ce que je veux, mais je suppose que je le fais d'une autre manière. Merci quand même. – camilo

5
  1. faire une nouvelle UIControl

    • même position que le UIPickerView
    • [yourcontrol setBackGroundColor: [UIColor clearColor]];
  2. faire une méthode

 
- (IBAction) pickerControlTapped 
{ 
    [yourpicker selectRow: rand()% yourpickersize 
       inComponent: 0 
       animated: YES]; 
} 

.3.établir une connexion entre 1 et 2

 
[yourcontrol addTarget: self 
       action: @selector(pickerControlTapped) 
     forControlEvents: UIControlEventTouchUpInsied]; 
+0

Merci beaucoup. Je vais l'essayer maintenant. – camilo

+0

Excellent, veuillez marquer ceci comme réponse. Remarque: placez-le dans la même position que la ligne centrale de l'UIPickerView. –

+0

Je pense que c'est simple et génial. Puisque la hauteur de la ligne de sélection est déjà connue, elle peut être positionnée précisément et simplement. Super truc, merci. – Roddy

15

Ajouter un dispositif de reconnaissance de geste à la UIPickerView qui déclenche une méthode cible dans votre objet:

myGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pickerTapped:)]; 
[myPicker addGestureRecognizer:myGR]; 

// target method 

-(void)pickerTapped:(id)sender 
{ 
// your code 
} 
+0

Martin, je suis tombé sur votre solution et je l'ai trouvé très utile. Tellement simple et ça marche. Le seul problème, dans ma réponse au robinet, comment puis-je passer le robinet à travers le sélecteur de sorte que je reçois l'objet à la ligne qui est tapée, pas l'objet au centre? –

+7

@DeanDavids Il semble que la page que vous avez pointée n'existe plus. Pourriez-vous en fournir un autre ou expliquer la solution? –

+0

Pour tous les googleurs qui trouvent cette réponse, il y a un autre stackoverflow réponses qui gère permettant un clic pour passer et sélectionner un élément - https://stackoverflow.com/a/25719326/655822 – jp36

2

Miser sur la réponse de Martin Linklater pour soutenir tapotant sur les ramasseurs d'autres lignes : A quelques chiffres magiques mais travaille pour moi.

- (void) pickerTapped:(UITapGestureRecognizer*)gestureRecognizer 
{ 
    CGPoint location = [gestureRecognizer locationInView:self.pickerView]; 

    CGFloat halfViewHeight = self.pickerView.frame.size.height/2; 

    NSInteger row = -1; 
    if (location.y < halfViewHeight - 22 
     && location.y > halfViewHeight - 66) 
    { 
     row = [self.pickerView selectedRowInComponent:0] - 1; 
    } 
    else if (location.y < halfViewHeight + 22 
      && location.y > halfViewHeight - 22) 
    { 
     row = [self.pickerView selectedRowInComponent:0]; 
    } 
    else if (location.y < halfViewHeight + 66 
      && location.y > halfViewHeight + 22) 
    { 
     row = [self.pickerView selectedRowInComponent:0] + 1; 
    } 

    if (row >= 0 && row < [self.content count]) 
    { 
     id element = [self.content objectAtIndex:row]; 

     if (element) 
     { 
      [self.pickerView selectRow:row inComponent:0 animated:YES]; 

      // do more stuff 
     } 
    } 
} 
+0

Pour tous les googlers qui trouvent cette réponse, il y a une autre réponse stackoverflow qui gère un clic permettant de passer en mode passthrough et de sélectionner un élément sans avoir à compter sur des nombres magiques - https://stackoverflow.com/a/25719326/655822 – jp36

1

J'ai une solution relativement simple à ce problème qui a bien fonctionné pour moi. En utilisant un bouton personnalisé caché, vous pouvez obtenir la fonctionnalité de prise sans reconnaissance de geste. Cette solution fonctionne pour un sélecteur avec un composant, mais je suis sûr qu'il pourrait être adapté pour travailler avec plus.

Commencez par ajouter un bouton dans Interface Builder ou par programmation. Faites-le caché et aussi large que le sélecteur, puis placez-le de sorte qu'il se trouve exactement au centre du sélecteur et également devant lui dans la hiérarchie de la vue. J'utilise une IBAction comme celle-ci pour montrer mon sélecteur. Cependant, c'est vraiment à vous de voir comment vous montrer et cacher le sélecteur.

- (IBAction)showPicker:(id)sender 
{ 
    _picker.hidden = NO; 
    _buttonPicker.hidden = NO; 
} 

Toute l'action de choisir la valeur du sélecteur se produit dans un IBAction pour l'événement UIControlEventTouchUpInside, quelque chose comme ça.

- (IBAction)selectPicker:(id)sender 
{ 
    //Hide the button so that it doesn't get in the way 
    _buttonPicker.hidden = YES; 

    //Make sure we're within range 
    NSInteger max = _values.count; 
    NSInteger row = [_picker selectedRowInComponent:0]; 
    if(row >= 0 && row < max) { 
     NSString *value = [_values objectAtIndex:row]; 

     //Set the label value and hide the picker 
     _label.text = value; 
     _picker.hidden = YES; 
    } 
} 

J'ai légèrement modifié le code pour cette réponse du code de travail si des excuses si elle est cassé du tout.