2009-10-28 5 views
2

Ce que je voudrais faire est la suivante:UIPickerView - événement déclenché lorsque la ligne est mise en évidence

A UIPickerView est affiché. Si l'utilisateur touche la ligne sélectionnée, la ligne est verrouillée (c'est un sélecteur multi-composants) et les autres composants sont libres de tourner. Si la ligne a déjà été verrouillée et que l'utilisateur touche la ligne verrouillée, la ligne est alors déverrouillée et libre de tourner. J'ai déjà codé la partie de verrouillage en utilisant un bouton. Je voudrais retirer le bouton et le remplacer par l'option sélecteur en surbrillance.

J'ai essayé:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 
} 

Apparemment, cela ne se déclenche que si la ligne n'a pas été sélectionnée déjà quand je touche une ligne qui se trouve dans la région en surbrillance, cet événement ne se déclenche pas.

J'ai ensuite essayé

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
NSLog(@"touchesBegan"); 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
NSLog(@"touchesMoved"); 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
NSLog(@"touchesEnded"); 
} 

Aucun de ces événements se déclenchent lorsque le sélecteur est touché.

Des idées sur la façon de détecter quand une ligne en surbrillance/sélectionnée dans un sélecteur est touchée par l'utilisateur?

Répondre

2

Bien - il existe une solution de contournement simple qui a fait exactement ce que je voulais accomplir. Fondamentalement, je voulais que l'utilisateur appuie sur la barre de sélection sur une vue sélecteur multicomposant et que ce composant soit verrouillé pendant que les autres sont libres de tourner.

Voici ce que je faisais:

Première - désactiver l'option pour afficher la barre de sélection. Deuxièmement, créez trois étiquettes - une pour chaque composant - les étiquettes ont la même hauteur et le même emplacement que la barre de sélection, mais il y en a une sur chaque composant. Ils se ressemblent pour être une barre solide. Troisième - créer une méthode pour modifier la couleur de l'étiquette pour indiquer qu'elle est verrouillée à l'utilisateur. J'utilise également un indicateur booléen pour informer les processus du programme lorsqu'un composant est verrouillé.

- (IBAction) lockButtonPress:(id)sender { 

    // determine which button was pressed.... 
    int btnPressed = 0; 
    if (leftSelectionBar.touchInside) btnPressed = 1; 
    if (centerSelectionBar.touchInside) btnPressed = 2; 
    if (rightSelectionBar.touchInside) btnPressed = 3; 

    // we are not going to make this difficult -- images for different states..... default in viewWillShow 
    switch (btnPressed) { 
     case 1: 
      if (lockSelected0) { 
       lockSelected0 = FALSE; 
       [leftSelectionBar setBackgroundColor:[UIColor blueColor]]; 
       [leftSelectionBar setAlpha:0.25]; 
      } else { 
       lockSelected0 = TRUE; 
       [leftSelectionBar setBackgroundColor:[UIColor redColor]]; 
       [leftSelectionBar setAlpha:0.45]; 

      } 
      break; 
     case 2: 
      if (lockSelected1) { 
       lockSelected1 = FALSE; 
       [centerSelectionBar setBackgroundColor:[UIColor blueColor]]; 
       [centerSelectionBar setAlpha:0.25]; 
      } else { 
       lockSelected1 = TRUE; 
       [centerSelectionBar setBackgroundColor:[UIColor redColor]]; 
       [centerSelectionBar setAlpha:0.45]; 
      } 
      break; 
     case 3: 
      if (lockSelected2) { 
       lockSelected2 = FALSE; 
       [rightSelectionBar setBackgroundColor:[UIColor blueColor]]; 
       [rightSelectionBar setAlpha:0.25]; 
      } else { 
       lockSelected2 = TRUE; 
       [rightSelectionBar setBackgroundColor:[UIColor redColor]]; 
       [rightSelectionBar setAlpha:0.45]; 
      } 
      break; 
     default: 
      break; 
    } 
} 

Et voilà .... simple:)

0

(void) pickerView: (UIPickerView *) thePickerView didSelectRow: (NSInteger) ligne inComponent: composant (NSInteger) {// code personnalisé Par exemple, si vous avez un NSArray ou un NSMutableArray appelé "list" dont les valeurs sont affichées sur UIPickerView - [liste objectAtIndex: row] où row est l'index retourné par l'événement UIPickerView retournera l'objet lui-même .

}

0

L'extrait de code suivant intercepter des gestes de claquettes sur une UIPickerView et déterminer si le robinet était à l'indicateur de sélection du UIPickerView:

D'abord, nous allons ajouter un UITapGestureRecognizer pour intercepter les gestes du robinet . Notez, que nous ne voulons pas annuler les touches parce que le UIPickerView devrait toujours faire tourner la roue et tout.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UITapGestureRecognizer* gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pickerViewTapGestureRecognized:)]; 
    gestureRecognizer.cancelsTouchesInView = NO; 

    [self.pickerView addGestureRecognizer:gestureRecognizer]; 
} 

Deuxièmement, nous allons vérifier, si le robinet était à l'indicateur de sélection de la UIPickerView (en supposant que l'indicateur de sélection utilise environ 15% de la hauteur de la UIPickerView - vous devrez peut-être ajuster cette valeur) :

- (void)pickerViewTapGestureRecognized:(UITapGestureRecognizer*)gestureRecognizer 
{ 
    CGPoint touchPoint = [gestureRecognizer locationInView:gestureRecognizer.view.superview]; 

    CGRect frame = self.pickerView.frame; 
    CGRect selectorFrame = CGRectInset(frame, 0.0, self.pickerView.bounds.size.height * 0.85/2.0); 

    if(CGRectContainsPoint(selectorFrame, touchPoint)) 
    { 
     NSLog(@"Selected Row: %i", [self.currentArticles objectAtIndex:[self.pickerView selectedRowInComponent:0]]); 
    } 
} 

Vous devez PAS mettre en œuvre le

- (void)pickerView:(UIPickerView*)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 

puisque nous détectons sel ection par nous-mêmes maintenant.