So ändern Sie die Schriftfarbe von UISegmentedControl

76

Ich versuche, die Schriftfarbe für UISegmentedControl(für iOS 4. *) von Weiß auf Schwarz zu ändern.

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

Die Textfarbe ändert sich jedoch nicht. Was soll ich tun, um die Textfarbe zu ändern UISegmentedControl?

Oksana
quelle

Antworten:

127

In iOS 6.0 und höher ist es sehr einfach:

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];
pbibergal
quelle
Haben Sie eine Idee zum Ändern des Schrifttyps?
Vaibhav Saran
[UIFont fontWithName:@"HelveticaNeue" size:17.0f]
pbibergal
Irgendwelche Ideen, was dazu führen könnte, dass dies nicht funktioniert? Als Experiment habe ich die Textfarbe auf Grün gesetzt, aber alles ist immer noch die Standardeinstellung (Grauer Text auf hellgrauem Hintergrund oder weißer Text auf blauem Hintergrund, wenn hervorgehoben. Das ist iOS6. IOS7 ist standardmäßig weiß / klar.) Danke!
Olie
Eine detaillierte Beschreibung finden Sie unter datacalculation.blogspot.in/2014/10/…
iOS Test
9
Beim Testen unter iOS 8.1 sollte sich die letzte Zeile dieser Antwort von UIControlStateHighlightedbis ändern UIControlStateSelected, um den gewünschten Effekt zu erzielen.
eifrig zu lernen
86

Wenn Sie die Textfarbe des hervorgehobenen Segments in iOS 7 ändern müssen, finden Sie hier eine Lösung (es hat eine Weile gedauert, bis ich sie gefunden habe, aber dank dieses Beitrags ):

Ziel c

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

Schnell

  let titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]  
  UISegmentedControl.appearance().setTitleTextAttributes(titleTextAttributes, forState: .Selected)
ich--
quelle
Toll. Sie können eine detaillierte Information unter datacalculation.blogspot.in/2014/10/…
iOS Test
Diese Antwort hat mir schließlich geholfen, die Anforderungen an die Auswahlschaltfläche meiner App zu erfüllen, einschließlich einer Möglichkeit, das segmentierte Steuerelement in einer Superansicht zu halten, um den Rand quadratisch zu machen ...
KoreanXcodeWorker
55

Code, um die Schriftfarbe beider Zustände auf Schwarz zu setzen

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)
Ilja Popov
quelle
Funktioniert nicht für iOS 13 und Swift 5, Xcode kann nicht segmentedControlmehr erkennen
Sky
1
@Sky, füge heute ein bisschen Bugfix auf dem segmentedControl meiner App hinzu, und diese Lösung funktioniert unter iOS 13.2 und Swift5.
ChuckZHB
31

Unten finden Sie den Code zum Festlegen der Schriftart auf Fettdruck und Punktgröße:

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

Ich hoffe, es hilft

Nimit Parekh
quelle
4
Achtung: Diese Antwort erfordert iOS 5.
Costique
1
Diese Antwort ändert nicht die Schriftfarbe, die der Themenstarter angefordert hat, sondern nur die Schriftgröße. Die Antwort von pbibergal ist vollständiger.
Terrabythia
Dies funktioniert, aber die Warnung für UITextAttributeFont ist veraltet. Verwenden Sie stattdessen "NSFontAttributeName". Alles dank @johngraham von stackoverflow.com/questions/2280391/…
Mavericks
12

Aktualisiert für iOS 13:

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

Aktualisiert für Swift 4 - Verwenden Sie diese Erweiterung (weil die Erweiterung immer fantastisch ist .. !!)

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

und aus der jeweiligen Klasse können Sie diese Funktion verwenden,

@IBOutlet weak var segment: UISegmentedControl!

segment.defaultConfiguration()
// or provide paramater as per your requirement
segment.selectedConfiguration(color: .blue)
Soumen
quelle
6
for (UIView *v in [[[segment subviews] objectAtIndex:0] subviews]) {
    if ([v isKindOfClass:[UILabel class]]) {
        UILabel *label=(UILabel *)[v retain];
        lable.textColor=[UIColor blackColor];
    }
}

für iOS 3.0 und höher

Schweben
quelle
6
Warnung: Sie sollten das Etikett nicht behalten.
Costique
5

Nur für den Fall, dass Sie jemand anderem helfen, der dort ankommt und mit Swift arbeitet.

Ich werde die zwei möglichen Wege nennen. Sie können die Textattribute in UIAppearanceoder direkt in dem Segment ändern, in dem Sie arbeiten.

Im ersten Beispiel werden die Attribute in der Darstellung festgelegt. Auf diese Weise können Sie alle segmentierten Steuerelemente in Ihrer App anpassen:

    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)

Im zweiten Beispiel direkt in der Segmentierung wird nur diese Segmentierung angepasst:

    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)
ggrana
quelle
4

schnell 3.2:

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

Hinweis: Wenn Sie eine benutzerdefinierte Hintergrundfarbe verwenden, wird in den Ecken ein Fehler angezeigt (Farbe füllt äußere Segmente aus.). Verwenden Sie daher diese Linie, um sie zu beschneiden:

segmentedControl!.layer.cornerRadius = 4.0
segmentedControl!.clipsToBounds = true
ingconti
quelle
4

In Swift 5 können Sie mit dieser Syntax die Farbe ändern

Swift 5

let titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.red]
groupSegment.setTitleTextAttributes(titleTextAttributes, for: .selected)
Mohsen
quelle
4

Swift 5- Erweiterung

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

}
Li Jin
quelle
2

In iOS 5.0 und höher können Sie die titleTextAttributes verwenden, um UISegmentedControlObjekte anzupassen :

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

Hier setze ich die Schriftart auf eine benutzerdefinierte Schriftart, Schriftgröße, Farbe für jeden Zustand der UISegmentedControl.

Alle möglichen einfachen Anpassungen finden Sie im Abschnitt Anpassen des Erscheinungsbilds der UISegmentedControl-Klassenreferenz.

Dulgan
quelle
1

Ich benutze Monotouch. Ich weiß nicht warum, aber als die Ansicht verschoben wurde, hat sich die Textfarbe für mich nicht geändert. Um dies zu lösen, füge ich einfach Beschriftungen zur Segmentsteuerungsübersicht hinzu und ändere dann ihre Farben:

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

und dann benutze es

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