Comment changer la couleur de police de UISegmentedControl

J’essaie de changer la couleur de la police du blanc au noir pour UISegmentedControl (pour iOS 4. *)

 UISegmentedControl *button = [[[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:itemTitle, nil]] autorelease]; button.momentary = YES; button.segmentedControlStyle = UISegmentedControlStyleBar; button.tintColor = [UIColor redColor]; for (id segment in [button subviews]) { for (id label in [segment subviews]) { if ([label isKindOfClass:[UILabel class]]) { UILabel *titleLabel = (UILabel *) label; [titleLabel setTextColor:[UIColor blackColor]]; } } } UIBarButtonItem *barButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease]; 

Mais la couleur du texte n’a pas changé. Que dois-je faire pour changer la couleur du texte pour UISegmentedControl ?

Dans iOS 6.0 et versions ultérieures, c’est très simple:

 NSDictionary *atsortingbutes = [NSDictionary dictionaryWithObjectsAndKeys: [UIFont boldSystemFontOfSize:17], NSFontAtsortingbuteName, [UIColor blackColor], NSForegroundColorAtsortingbuteName, nil]; [_segmentedControl setTitleTextAtsortingbutes:atsortingbutes forState:UIControlStateNormal]; NSDictionary *highlightedAtsortingbutes = [NSDictionary dictionaryWithObject:[UIColor whiteColor] forKey:NSForegroundColorAtsortingbuteName]; [_segmentedControl setTitleTextAtsortingbutes:highlightedAtsortingbutes forState:UIControlStateSelected]; 

Si vous avez besoin de changer la couleur du texte du segment en surbrillance dans iOS 7, voici une solution (cela m’a pris du temps à trouver, mais grâce à ce post ):

Objectif c

 [[UISegmentedControl appearance] setTitleTextAtsortingbutes:@{NSForegroundColorAtsortingbuteName : [UIColor blackColor]} forState:UIControlStateSelected]; 

Rapide

  let titleTextAtsortingbutes = [NSForegroundColorAtsortingbuteName: UIColor.whiteColor()] UISegmentedControl.appearance().setTitleTextAtsortingbutes(titleTextAtsortingbutes, forState: .Selected) 

Le code ci-dessous permet de définir la police en caractères gras et en taille de point:

 UIFont *Boldfont = [UIFont boldSystemFontOfSize:12.0f]; NSDictionary *atsortingbutes = [NSDictionary dictionaryWithObject:Boldfont forKey: NSFontAtsortingbuteName]; [segmentedControl setTitleTextAtsortingbutes:atsortingbutes forState:UIControlStateNormal]; 

J’espère que ça aide

Code Swift 4 pour définir la couleur de police des deux états en noir

  let titleTextAtsortingbutes = [NSAtsortingbutedSsortingngKey.foregroundColor: UIColor.black] segmentedControl.setTitleTextAtsortingbutes(titleTextAtsortingbutes, for: .normal) segmentedControl.setTitleTextAtsortingbutes(titleTextAtsortingbutes, for: .selected) 
 for (UIView *v in [[[segment subviews] objectAtIndex:0] subviews]) { if ([v isKindOfClass:[UILabel class]]) { UILabel *label=(UILabel *)[v retain]; lable.textColor=[UIColor blackColor]; } } 

pour iOS 3.0 et supérieur

Juste au cas où pour aider quelqu’un qui y arrive et qui utilise Swift.

Je vais mettre les deux manières possibles de le faire. Vous pouvez modifier les atsortingbuts de texte dans UIAppearance ou directement dans votre segmenté.

Le premier exemple définissant les atsortingbuts dans l’apparence, vous personnaliserez ainsi tous les contrôles segmentés de votre application:

  let atsortingbutes = [ NSForegroundColorAtsortingbuteName : UIColor.grayColor(), NSFontAtsortingbuteName : UIFont.systemFontOfSize(20)]; let atsortingbutesSelected = [ NSForegroundColorAtsortingbuteName : UIColor.blueColor(), NSFontAtsortingbuteName : UIFont.systemFontOfSize(20)]; UISegmentedControl.appearance().setTitleTextAtsortingbutes(atsortingbutes, forState: UIControlState.Normal) UISegmentedControl.appearance().setTitleTextAtsortingbutes(atsortingbutesSelected, forState: UIControlState.Selected) 

Le deuxième exemple, directement dans le segmenté, ne personnalisera que ce segmenté:

  let atsortingbutes = [ NSForegroundColorAtsortingbuteName : UIColor.grayColor(), NSFontAtsortingbuteName : UIFont.systemFontOfSize(20)]; let atsortingbutesSelected = [ NSForegroundColorAtsortingbuteName : UIColor.blueColor(), NSFontAtsortingbuteName : UIFont.systemFontOfSize(20)]; segmented.setTitleTextAtsortingbutes(atsortingbutes, forState: UIControlState.Normal) segmented.setTitleTextAtsortingbutes(atsortingbutesSelected, forState: UIControlState.Selected) 

swift 3.2:

 let atsortingbutes = [ NSFontAtsortingbuteName : bigTextFont, NSForegroundColorAtsortingbuteName : UIColor.blue, ] segmentedControl?.setTitleTextAtsortingbutes(atsortingbutes, for: .normal) 

note: si vous utilisez une couleur d’arrière-plan personnalisée, vous verrez un pépin dans les coins (la couleur remplira les segments extérieurs ..), utilisez donc ces lignes pour les découper:

 segmentedControl!.layer.cornerRadius = 4.0 segmentedControl!.clipsToBounds = true 

Dans iOS 5.0 et versions ultérieures, vous pouvez utiliser le titleTextAtsortingbutes pour personnaliser les objects UISegmentedControl :

 NSDictionary *segmentedControlTextAtsortingbutes = @{NSFontAtsortingbuteName:[UIFont fontWithName:@"HelveticaNeue" size:18.0], NSForegroundColorAtsortingbuteName:[UIColor whiteColor]}; [self.segmentedControl setTitleTextAtsortingbutes:segmentedControlTextAtsortingbutes forState:UIControlStateNormal]; [self.segmentedControl setTitleTextAtsortingbutes:segmentedControlTextAtsortingbutes forState:UIControlStateHighlighted]; [self.segmentedControl setTitleTextAtsortingbutes:segmentedControlTextAtsortingbutes forState:UIControlStateSelected]; 

Ici, je règle la police sur une police personnalisée, une taille de police et une couleur pour chaque état de UISegmentedControl .

Vous trouverez toutes les personnalisations simples possibles dans la section Apparence du Customizing de la référence de classe UISegmentedControl.

Mis à jour pour Swift 4 – Utilisez cette extension (car l’extension est toujours géniale .. !!)

 extension UISegmentedControl { func defaultConfiguration(font: UIFont = UIFont.systemFont(ofSize: 12), color: UIColor = UIColor.gray) { let defaultAtsortingbutes = [ NSAtsortingbutedSsortingngKey.font.rawValue: font, NSAtsortingbutedSsortingngKey.foregroundColor.rawValue: color ] setTitleTextAtsortingbutes(defaultAtsortingbutes, for: .normal) } func selectedConfiguration(font: UIFont = UIFont.boldSystemFont(ofSize: 12), color: UIColor = UIColor.red) { let selectedAtsortingbutes = [ NSAtsortingbutedSsortingngKey.font.rawValue: font, NSAtsortingbutedSsortingngKey.foregroundColor.rawValue: color ] setTitleTextAtsortingbutes(selectedAtsortingbutes, for: .selected) } } 

et de la classe respective, vous pouvez utiliser ces fonctions,

 @IBOutlet weak var segment: UISegmentedControl! segment.defaultConfiguration() // or provide paramater as per your requirement segment.selectedConfiguration(color: .blue) 

Im utiliser monotouch. Je ne sais pas pourquoi, mais quand View a été poussé, la couleur du texte n’a pas changé pour moi. pour résoudre ce problème, il suffit d’append des étiquettes à la vue d’ensemble du contrôle de segment, puis de modifier leurs couleurs:

 public static void SetColoredTittles(this UISegmentedControl s, ssortingng[] titles, UIColor selected, UIColor notSelected) { var segmentedLabels = new List(); float width = s.Frame.Width/titles.Length; for (int i = 0; i < titles.Length; i++) { var frame = new RectangleF(s.Frame.X + i*width, s.Frame.Y, width,s.Frame.Height); UILabel label = new UILabel(frame); label.TextAlignment = UITextAlignment.Center; label.BackgroundColor = UIColor.Clear; label.Font = UIFont.BoldSystemFontOfSize(12f); label.Text = titles[i]; s.Superview.AddSubview(label); segmentedLabels.Add(label); } s.ValueChanged += delegate { TextColorChange(s,segmentedLabels, selected, notSelected); }; TextColorChange(s,segmentedLabels, selected, notSelected); } static void TextColorChange(UISegmentedControl s, List segmentedLabels, UIColor selected, UIColor notSelected) { for (int i = 0; i < segmentedLabels.Count; i++) { if(i == s.SelectedSegment) segmentedLabels[i].TextColor = selected; else segmentedLabels[i].TextColor = notSelected; } } 

et ensuite l'utiliser

 segmented.SetColoredTittles(new ssortingng[] { "text1", "text2", "text3" }, UIColor.White,UIColor.DarkGray);