Comment changer la couleur de police de UISegmentedControl

j'essaie de modifier la police la couleur 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 ?

54
demandé sur Costique 2012-01-27 10:32:09

10 réponses

dans iOS 6.0 et au-dessus c'est très simple:

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                            [UIFont boldSystemFontOfSize:17], NSFontAttributeName,
                            [UIColor blackColor], NSForegroundColorAttributeName,
                            nil];
[_segmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];
NSDictionary *highlightedAttributes = [NSDictionary dictionaryWithObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName];
[_segmentedControl setTitleTextAttributes:highlightedAttributes forState:UIControlStateSelected];
114
répondu pbibergal 2016-12-29 14:35:56

si vous avez besoin de changer la couleur du texte du segment en surbrillance dans iOS 7, Voici une solution (m'a pris un certain temps pour trouver, mais merci à ce post ):

Objectif-C

[[UISegmentedControl appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor blackColor]} forState:UIControlStateSelected];

Swift

  let titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]  
  UISegmentedControl.appearance().setTitleTextAttributes(titleTextAttributes, forState: .Selected)
62
répondu i-- 2017-05-23 12:17:44

ci - dessous est le code pour mettre la police en gras et la taille de point:

UIFont *Boldfont = [UIFont boldSystemFontOfSize:12.0f];
NSDictionary *attributes = [NSDictionary dictionaryWithObject:Boldfont
                                                       forKey: NSFontAttributeName];
[segmentedControl setTitleTextAttributes:attributes 
                                forState:UIControlStateNormal];

j'espère que cela aide

29
répondu Nimit Parekh 2015-09-22 13:09:17

Swift 4 code pour définir les deux états couleur de police au noir

    let titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.black]
    segmentedControl.setTitleTextAttributes(titleTextAttributes, for: .normal)
    segmentedControl.setTitleTextAttributes(titleTextAttributes, for: .selected)
9
répondu Ilja Popov 2018-01-23 16:03:59
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 plus

7
répondu Levitate 2013-07-07 23:42:22

juste au cas où vous aideriez quelqu'un d'autre qui s'y rend et travaille avec swift.

je vais mettre les deux façons possibles de le faire. Vous pouvez changer les attributs de texte dans le UIAppearance ou directement dans le segmenté votre travaillent.

le premier exemple définissant les attributs dans l'apparence, de cette façon vous personnaliserez tous les contrôles segmentés dans votre application:

    let attributes = [ NSForegroundColorAttributeName : UIColor.grayColor(),
        NSFontAttributeName : UIFont.systemFontOfSize(20)];
    let attributesSelected = [ NSForegroundColorAttributeName : UIColor.blueColor(),
        NSFontAttributeName : UIFont.systemFontOfSize(20)];
    UISegmentedControl.appearance().setTitleTextAttributes(attributes, forState: UIControlState.Normal)
    UISegmentedControl.appearance().setTitleTextAttributes(attributesSelected, forState: UIControlState.Selected)

le deuxième exemple, directement en le segmenté, personnalisera seulement ce segmenté:

    let attributes = [ NSForegroundColorAttributeName : UIColor.grayColor(),
        NSFontAttributeName : UIFont.systemFontOfSize(20)];
    let attributesSelected = [ NSForegroundColorAttributeName : UIColor.blueColor(),
        NSFontAttributeName : UIFont.systemFontOfSize(20)];
    segmented.setTitleTextAttributes(attributes, forState: UIControlState.Normal)
    segmented.setTitleTextAttributes(attributesSelected, forState: UIControlState.Selected)
4
répondu ggrana 2016-04-27 00:45:47

swift 3.2:

let attributes = [
                          NSFontAttributeName : bigTextFont,
                          NSForegroundColorAttributeName : UIColor.blue,
                          ]         
segmentedControl?.setTitleTextAttributes(attributes, for: .normal)

note: si vous utilisez une couleur de fond personnalisée, vous verrez un bug dans les Coins (la couleur remplira les segments extérieurs..), utilisez donc ces lignes pour le clip:

segmentedControl!.layer.cornerRadius = 4.0
segmentedControl!.clipsToBounds = true
4
répondu ingconti 2017-08-03 12:17:01

mis à jour pour Swift 4 - Utilisez cette Extension (parce que l'extension est toujours géniale..!!)

extension UISegmentedControl {

func defaultConfiguration(font: UIFont = UIFont.systemFont(ofSize: 12), color: UIColor = UIColor.gray) {
    let defaultAttributes = [
        NSAttributedStringKey.font.rawValue: font,
        NSAttributedStringKey.foregroundColor.rawValue: color
    ]
    setTitleTextAttributes(defaultAttributes, for: .normal)
}

func selectedConfiguration(font: UIFont = UIFont.boldSystemFont(ofSize: 12), color: UIColor = UIColor.red) {
    let selectedAttributes = [
        NSAttributedStringKey.font.rawValue: font,
        NSAttributedStringKey.foregroundColor.rawValue: color
    ]
    setTitleTextAttributes(selectedAttributes, for: .selected)
}
}

et de la classe respective, vous pouvez utiliser cette fonction,

@IBOutlet weak var segment: UISegmentedControl!

segment.defaultConfiguration()
// or provide paramater as per your requirement
segment.selectedConfiguration(color: .blue)
4
répondu Soumen 2018-06-11 10:14:03

dans iOS 5.0 et plus tard, vous pouvez utiliser le titleTextAttributes pour personnaliser UISegmentedControl objets:

NSDictionary *segmentedControlTextAttributes = @{NSFontAttributeName:[UIFont fontWithName:@"HelveticaNeue" size:18.0], NSForegroundColorAttributeName:[UIColor whiteColor]};
[self.segmentedControl setTitleTextAttributes:segmentedControlTextAttributes forState:UIControlStateNormal];
[self.segmentedControl setTitleTextAttributes:segmentedControlTextAttributes forState:UIControlStateHighlighted];
[self.segmentedControl setTitleTextAttributes:segmentedControlTextAttributes forState:UIControlStateSelected];

ici je mets la police à une police personnalisée, Taille de police, couleur pour chaque État du UISegmentedControl .

vous trouverez toutes les personnalisations simples possibles dans la section personnalisation de L'apparence de la référence de classe UISegmentedControl.

2
répondu dulgan 2015-06-01 12:25:43

Im en utilisant monotouch. Je ne sais pas pourquoi, mais quand la vue a été poussée la couleur du texte n'a pas changé pour moi. pour résoudre ce im il suffit d'ajouter des étiquettes pour le contrôle de segment superview et ensuite changer leurs couleurs:

public static void SetColoredTittles(this UISegmentedControl s, string[] titles, UIColor selected, UIColor notSelected)
{ 
    var segmentedLabels = new List<UILabel>();
    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<UILabel> 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 string[] {
            "text1",
            "text2",
            "text3"
        }, UIColor.White,UIColor.DarkGray);
1
répondu John 2012-11-20 14:45:15