How to change font color of UISegmentedControl
Asked Answered
O

13

91

I try to change font color from white to black for UISegmentedControl (for 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];

But text color does not changed. What I should do for change text color for UISegmentedControl?

Ofelia answered 27/1, 2012 at 6:32 Comment(0)
F
133

In iOS 6.0 and above it's very 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];
Fencer answered 18/11, 2012 at 10:19 Comment(6)
any idea about changing font type?Peyter
[UIFont fontWithName:@"HelveticaNeue" size:17.0f]Fencer
Any ideas what might cause this not to work? As an experiment, I set the text color to green, but everything is still the defaults (Grey text on pale-grey background, or white text on blue background if highlighted. That's iOS6. iOS7 is default white/clear.) Thanks!Assai
a detailed description given at datacalculation.blogspot.in/2014/10/…Heathenize
Testing on iOS 8.1, the last line to this answer should change from UIControlStateHighlighted to UIControlStateSelected to achieve the desired effect.Monogamous
Is it possible for a single Segment?Intimacy
I
93

If you need to change the text color of the highlighted segment in iOS 7, here is a solution (took me awhile to find, but thanks to this post):

Objective-C

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

Swift

  let titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]  
  UISegmentedControl.appearance().setTitleTextAttributes(titleTextAttributes, forState: .Selected)
Inefficient answered 31/1, 2014 at 16:17 Comment(3)
Great. You can follow a detailed info at datacalculation.blogspot.in/2014/10/…Heathenize
This answer finally helped me completing the requirements on the selection button of my App, previously including a way of keeping the segmented control in a super uiview to make the border square....Mouton
For Swift 5: var titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white] UISegmentedControl.appearance().setTitleTextAttributes(titleTextAttributes, for: .normal)Frustum
I
86

code to set both states font color to black

Swift 5

    let titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.black]
    segmentedControl.setTitleTextAttributes(titleTextAttributes, for: .normal)
    segmentedControl.setTitleTextAttributes(titleTextAttributes, for: .selected)

Swift 4

    let titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.black]
    segmentedControl.setTitleTextAttributes(titleTextAttributes, for: .normal)
    segmentedControl.setTitleTextAttributes(titleTextAttributes, for: .selected)
Illiteracy answered 23/1, 2018 at 16:3 Comment(2)
Does not work for iOS 13 and Swift 5, Xcode can't recognize segmentedControl anymoreAffirmative
@Sky, just add a bit of bug fix on my app's segmentedControl today, and this solution is worked on iOS 13.2 and Swift5.Deakin
P
31

Below is the code to set the font to the bold face and point size:

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

I hope it helps

Purapurblind answered 27/1, 2012 at 12:52 Comment(3)
Caution: this answer requires iOS 5.Crandall
This answer doesn't change the font color as the topic starter requested, just the font size. pbibergal's answer is more complete.Delinda
This works, but warning is coming for UITextAttributeFont is deprecated. Instead use "NSFontAttributeName". All thanks to @johngraham from #2280891Thermoelectrometer
S
22

Updated for iOS 14 and Swift 5:

extension UISegmentedControl
{
    func defaultConfiguration(font: UIFont = UIFont.systemFont(ofSize: 12), color: UIColor = UIColor.white)
    {
        let defaultAttributes = [
            NSAttributedString.Key.font: font,
            NSAttributedString.Key.foregroundColor: color
        ]
        setTitleTextAttributes(defaultAttributes, for: .normal)
    }

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

Updated for Swift 4 - Use this Extension (because extension is always awesome..!!)

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)
}
}

and from the respective class, you can use these function,

@IBOutlet weak var segment: UISegmentedControl!

segment.defaultConfiguration()
// or provide paramater as per your requirement
segment.selectedConfiguration(color: .blue)
Spector answered 11/6, 2018 at 10:14 Comment(0)
S
8

Swift 5 Extension

extension UISegmentedControl {

    func setTitleColor(_ color: UIColor, state: UIControl.State = .normal) {
        var attributes = self.titleTextAttributes(for: state) ?? [:]
        attributes[.foregroundColor] = color
        self.setTitleTextAttributes(attributes, for: state)
    }
    
    func setTitleFont(_ font: UIFont, state: UIControl.State = .normal) {
        var attributes = self.titleTextAttributes(for: state) ?? [:]
        attributes[.font] = font
        self.setTitleTextAttributes(attributes, for: state)
    }

}
Sainted answered 10/2, 2020 at 17:55 Comment(1)
Working as expected. ThanksFrancyne
A
7

in Swift 5 you can change color with this syntax

Swift 5

let titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.red]
groupSegment.setTitleTextAttributes(titleTextAttributes, for: .selected)
Amputate answered 26/9, 2019 at 19:8 Comment(0)
H
6
for (UIView *v in [[[segment subviews] objectAtIndex:0] subviews]) {
    if ([v isKindOfClass:[UILabel class]]) {
        UILabel *label=(UILabel *)[v retain];
        lable.textColor=[UIColor blackColor];
    }
}

for iOS 3.0 and above

Handicap answered 18/2, 2012 at 9:21 Comment(1)
Warning: you shouldn't retain the label.Crandall
C
5

Just in case to help someone else that get there and is working using swift.

I will put the two possible ways of doing it. You can change the text attributes in the UIAppearance or directly in the segmented your are working.

The first example setting the attributes in the appearance, this way you will customize all the segmented controls in your app:

    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)

The second example, directly in the segmented, will customize only this segmented:

    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)
Cesta answered 27/4, 2016 at 0:45 Comment(0)
S
4

swift 3.2:

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

note: if You use a custom background color, you will see a glitch in corners (color will fill outside segments..), so use these line to clip it:

segmentedControl!.layer.cornerRadius = 4.0
segmentedControl!.clipsToBounds = true
Staffman answered 3/8, 2017 at 12:17 Comment(0)
A
2

In iOS 5.0 and later you can use the titleTextAttributes to customize UISegmentedControl objects :

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];

Here I set the font to a custom font, font size, color for each state of the UISegmentedControl.

You'll find every possible simple customizations in the Customizing Appearance section of the UISegmentedControl Class Reference.

Arterio answered 17/10, 2014 at 9:34 Comment(0)
J
1

Im using monotouch. Dont know why, but when View was pushed text color doesnt changed for me. for solve this im just add labels to segment control superview and then change their colours:

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;
    }
}

and then use it

segmented.SetColoredTittles(new string[] {
            "text1",
            "text2",
            "text3"
        }, UIColor.White,UIColor.DarkGray);
Jezebel answered 16/11, 2012 at 18:11 Comment(0)
P
0

Call this in the controller's viewdidload:

func updateSegmentedControlColors() {
    segmentedControl.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white], for: .normal)
    segmentedControl.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.systemPink], for: .selected)
}
Pomegranate answered 2/6 at 19:22 Comment(1)
Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.Futures

© 2022 - 2024 — McMap. All rights reserved.