70 votes

Couleur de segment sélectionnée par UISegmentedControl

Est-il possible de personnaliser la couleur du segment sélectionné dans UISegmentedControl?

J'ai trouvé segmentedController.nuance de couleur de la propriété, ce qui me permet de personnaliser la couleur de l'ensemble de la commande segmentée. Le problème c'est que quand je sélectionne la couleur lumineuse pour la nuance de couleur de la propriété, segment sélectionné devient presque méconnaissable (sa couleur est presque le même que le reste de la commande segmentée, il est donc difficile de distinguer sélectionnés et non sélectionnés segments). Donc je ne peut pas utiliser les bonnes couleurs vives pour segmentée de contrôle. La solution serait un bien pour le segment sélectionné la couleur, mais je ne le trouve pas. Quelqu'un a la solution?

74voto

Lee Whitney Points 3570

Ici est la façon la plus simple pour modifier le segment sélectionné à toute couleur de RVB. Pas de sous-classement ou hacks nécessaire.

segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;

UIColor *newTintColor = [UIColor colorWithRed: 251/255.0 green:175/255.0 blue:93/255.0 alpha:1.0];
    segmentedControl.tintColor = newTintColor;

UIColor *newSelectedTintColor = [UIColor colorWithRed: 0/255.0 green:175/255.0 blue:0/255.0 alpha:1.0];
[[[segmentedControl subviews] objectAtIndex:0] setTintColor:newSelectedTintColor];

Cet exemple illustre l'importance des étapes de:

  1. Définit le style de contrôle de "StyleBar", qui est nécessaire pour qu'il de travail
  2. Jeux de l'onu, la couleur sélectionnée pour le ensemble de contrôle de la première à l'orange
  3. Définit la couleur de la sélection de la segment vert

Notes:

  • Les étapes 1 et 2 peut être fait dans interface builder, ou dans le code comme montré. Cependant l'étape 3 ne peut être fait dans le code
  • Les valeurs de couleur définie avec notation comme celle-ci "123.0/255.0" est juste un moyen de rendre les valeurs RVB se démarquer au lieu du normalisée flotteur valeurs requises par UIColor (juste l'ignorer si vous le souhaitez)

53voto

jothikenpachi Points 425

J'ai trouvé un moyen simple d'ajouter de la couleur pour le segment sélectionné dans UISegmentcontrol

l'expéditeur est UISegmentControl

 for (int i=0; i<[sender.subviews count]; i++) 
{
    if ([[sender.subviews objectAtIndex:i]isSelected] ) 
    {               
    UIColor *tintcolor=[UIColor colorWithRed:127.0/255.0 green:161.0/255.0 blue:183.0/255.0 alpha:1.0];
    [[sender.subviews objectAtIndex:i] setTintColor:tintcolor];
    }
   else 
    {
        [[sender.subviews objectAtIndex:i] setTintColor:nil];
    }
}
 

Vérifiez son travail pour moi

23voto

David Thompson Points 887

Pour ce faire, il vous suffit de trouver le segment sélectionné, par exemple par une itération sur la segmentation du contrôle des sous-vues et le test de l' isSelected de la propriété, puis il suffit d'appeler l' setTintColor: méthode sur la sous-vue.

Je l'ai fait par la connexion d'une action pour chaque commande segmentée sur l'événement ValueChanged dans Interface Builder, je suis connecté à cette méthode dans la vue contrôleur de fichier qui est essentiellement msprague's réponse:

- (IBAction)segmentedControlValueChanged:(UISegmentedControl*)sender
{
    for (int i=0; i<[sender.subviews count]; i++)
    {
        if ([[sender.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && [[sender.subviews objectAtIndex:i]isSelected])
        {
            [[sender.subviews objectAtIndex:i] setTintColor:[UIColor whiteColor]];
        }
        if ([[sender.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && ![[sender.subviews objectAtIndex:i] isSelected])
        {
            [[sender.subviews objectAtIndex:i] setTintColor:[UIColor blackColor]];
        }
    }
}

Pour s'assurer que le contrôle est affiché correctement chaque fois que l'affichage est ouvert par l'utilisateur, j'ai aussi eu à remplacer l' -(void)viewDidAppear:animated méthode et d'appeler la méthode comme suit:

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    //Ensure the segmented controls are properly highlighted
    [self segmentedControlValueChanged:segmentedControlOne];
    [self segmentedControlValueChanged:segmentedControlTwo];
}

Pour certains points de bonus si vous ne souhaitez définir la segmentation de contrôle de l'utilisation d'un blanc couleur de teinte sur la sélection, puis vous aurez aussi envie de changer la couleur du texte en noir quand il est sélectionné, vous pouvez le faire comme ceci:

//Create a dictionary to hold the new text attributes
NSMutableDictionary * textAttributes = [[NSMutableDictionary alloc] init];
//Add an entry to set the text to black
[textAttributes setObject:[UIColor blackColor] forKey:UITextAttributeTextColor];
//Set the attributes on the desired control but only for the selected state
[segmentedControlOne setTitleTextAttributes:textAttributes forState:UIControlStateSelected];

Avec l'introduction de l' iOS 6 réglage de la teinte de la couleur de l'élément sélectionné pour la première fois dans le viewDidAppear coutume méthode de travail, pour contourner cela, j'ai utilisé de grand central dispatch pour changer la couleur sélectionnée après une fraction de seconde comme suit:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.05 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        [self segmentedControlValueChanged:segmentedControlOne];
    });

9voto

Seb Kade Points 797

Hey, Pour une raison que Apple ne vous permettent de changer la couleur de l'étendard UISegmentedControls.

Il existe cependant une voie "légale" autour d'elle ce qui est de changer la segmentation de contrôler le style de UISegmentedControlStyleBar. Cela lui donne une apparence légèrement différente qui peuvent ne pas vous plaire, mais il ne permet pas de couleur.

    NSArray *itemArray = [NSArray arrayWithObjects: @"One", @"Two", @"Three", nil];
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:itemArray];

//Modification de la Barre de Style et d'annonces à afficher, puis relâchez segmenté contrôleur

segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
segmentedControl.tintColor = [UIColor colorWithRed:.9 green:.1 blue:.1 alpha:1]; 
[self.view addSubview:segmentedControl];
[segmentedControl release];

Espérons que cela a aidé,

Seb Kade "Je suis ici pour vous aider"

8voto

Mike Sprague Points 124

Edit : Cette solution ne fonctionne pas sur iOS 6. Voir la réponse de David Thompson ci-dessous.

Ce fil est vraiment vieux, mais aucune des réponses simples n'a fonctionné correctement pour moi.

La réponse acceptée fonctionne tant que vous inversez la couleur des contrôles segmentés désélectionnés. Quelque chose comme ceci fonctionnera dans votre fonction de valeur modifiée:

 for (int i=0; i<[control.subviews count]; i++) 
{
    if ([[control.subviews objectAtIndex:i]isSelected] ) 
    {               
        UIColor *tintcolor=[UIColor colorWithRed:127.0/255.0 green:161.0/255.0 blue:183.0/255.0 alpha:1.0];
        [[control.subviews objectAtIndex:i] setTintColor:tintcolor];
    } else {
        UIColor *tintcolor=[UIColor grayColor]; // default color
        [[control.subviews objectAtIndex:i] setTintColor:tintcolor];
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X