2009-06-05 7 views
8

J'ai une coutume UIPickerView où je l'utilise:Redéfinition mis en évidence dans la sélection UIPickerView

-(UIView *)pickerView:(UIPickerView *)pickerView 
     viewForRow:(NSInteger)row 
    forComponent:(NSInteger)component 
     reusingView:(UIView *)view 

pour alimenter le sélecteur avec UILabels. Est-il possible de désactiver le comportement de mise en surbrillance de la ligne sélectionnée lorsque vous appuyez sur?

Je pense que c'est une propriété du sous-jacente UITableViewCell inhérente au UIPickerView et je ne trouve pas un moyen de le changer.

Répondre

16

Vous devez vous assurer que votre vue personnalisée a les propriétés suivantes:

  1. Il doit être dimensionné pour les mêmes dimensions que le UIPickerView basé sur vos attend les méthodes de délégués - pickerView:rowHeightForComponent: et pickerView:widthForComponent:. La hauteur par défaut est 44 si vous ne spécifiez pas de hauteur personnalisée.
  2. La couleur d'arrière-plan doit être [UIColor clearColor].
  3. La vue doit capturer toutes les touches.

L'un Gotcha lors de l'utilisation UILabel instances comme la vue personnalisée est que UILabel par défaut userInteractionEnabled-NO (UIView, d'autre part, par défaut cette propriété à YES).

En fonction de ces exigences, l'exemple de code de Halle peut être réécrit comme suit. Cet exemple réutilise également correctement les vues précédemment créées, ce qui est nécessaire pour les performances de défilement rapide.

- (UIView *)pickerView:(UIPickerView *)pickerView 
      viewForRow:(NSInteger)row 
      forComponent:(NSInteger)component 
      reusingView:(UIView *)view { 

    UILabel *pickerRowLabel = (UILabel *)view; 
    if (pickerRowLabel == nil) { 
    // Rule 1: width and height match what the picker view expects. 
    //   Change as needed. 
    CGRect frame = CGRectMake(0.0, 0.0, 320, 44); 
    pickerRowLabel = [[[UILabel alloc] initWithFrame:frame] autorelease]; 
    // Rule 2: background color is clear. The view is positioned over 
    //   the UIPickerView chrome. 
    pickerRowLabel.backgroundColor = [UIColor clearColor]; 
    // Rule 3: view must capture all touches otherwise the cell will highlight, 
    //   because the picker view uses a UITableView in its implementation. 
    pickerRowLabel.userInteractionEnabled = YES; 
    } 
    pickerRowLabel.text = [pickerDataArray objectAtIndex:row]; 

    return pickerRowLabel; 
} 
0

Je suppose que vous voudrez peut-être regarder propriété « showsSelectionIndicator » de UIPickerView

+0

L'indicateur showsSelectionIndicator est responsable de l'affichage de la barre bleue sur la valeur qui sera renvoyée par le sélecteur. Il n'a malheureusement rien à voir avec la structure sous-jacente UITableViewCell. – Jon

0

Je ne sais pas s'il y a un moyen facile de supprimer les commentaires de sélection, mais vous pouvez le couvrir si vous faites l'arrière-plan de l'étiquette blanche et la taille pour les mêmes dimensions que le rectangle de sélection bleu:

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { 

    UILabel *pickerRowLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 316, 40)]; 
    pickerRowLabel.backgroundColor = [UIColor whiteColor]; 
    pickerRowLabel.text = [pickerDataArray objectAtIndex:row]; 
    [self.view addSubview:pickerRowLabel]; 

    return pickerRowLabel; 

} 

Avec une largeur de 316 l'étiquette couvre tout sauf un ruban de bleu de chaque côté, et à 320 qu'elle recouvre complètement la sélection rétroaction mais il commence aussi à couvrir un peu des gradients de roue externes, qui peuvent ou ne peuvent pas vous déranger.

12

Définition de la propriété userInteractionEnabled de UILabel à YES fixe la question mise en évidence, mais il désactive aussi le UIPickerView de défilement automatique pour sélectionner la ligne qui a été touché.

Si vous souhaitez désactiver le comportement de mise en évidence, mais maintenir la fonctionnalité de défilement automatique par défaut de UIPickerView, appelez le dans les instances UITableCell fonction setShowSelection contenues dans le UIPickerView. Une façon de le faire est de sous-classe de la classe UILabel semblable au suivant:

PickerViewLabel.h -

#import <UIKit/UIKit.h> 

@interface PickerViewLabel:UILabel 
{ 
} 

@end 

PickerViewLabel.m -

#import "PickerViewLabel.h" 

@implementation PickerViewLabel 

- (void)didMoveToSuperview 
{ 
if ([[self superview] respondsToSelector:@selector(setShowSelection:)]) 
{ 
    [[self superview] performSelector:@selector(setShowSelection:) withObject:NO]; 
} 
} 

@end 

Alors, où vous aviez été retournerez une instance de UILabel dans pickerView:viewForRow:forComponent:reusingView:, retourner une instance de PickerViewLabel. Par exemple, en utilisant le code de Doug, vous devez remplacer tous les cas de 'UILabel' par 'PickerViewLabel'. N'oubliez pas de supprimer la ligne pickerRowLabel.userInteractionEnabled = YES;.

+0

Salut Christine, j'ai implémenté le même code ci-dessus mais la sélection encore bleue arrive aux deux extrémités de la ligne sélectionnée. Lorsque j'essaie de déboguer le code, j'ai trouvé que didMoveToSuperview n'est pas appelé n'importe où. Pouvez-vous m'aider? Merci. – engineer

+0

Hey Shailesh, C'est difficile à dire sans voir votre code, mais j'ai quelques idées pour savoir pourquoi il ne serait pas appelé. 'didMoveToSuperview' est une fonction de UIView qui est appelée automatiquement à chaque fois qu'un UIView est ajouté ou supprimé d'une vue. Votre vue personnalisée est-elle définitivement ajoutée à l'écran? Si vous effectuez un test rapide et que vous ajoutez une instance de votre classe en tant que sous-vue de la vue d'un UIViewController, voyez-vous 'didMoveToSuperview' appelé? Sinon, je suppose que vous avez une faute de frappe quelque part dans la déclaration de la fonction. – Christine

+0

super .... merci beaucoup .. tu me sauves la vie et beaucoup de temps –