Як змінити колір шрифту UISegmentedControl


81

Я намагаюся змінити колір шрифту з білого на чорний для UISegmentedControl(для 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];

Але колір тексту не змінюється. Що я повинен зробити для зміни кольору тексту UISegmentedControl?

Відповіді:


128

У iOS 6.0 і вище це дуже просто:

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

будь-яка ідея про зміну типу шрифту?
Вайбхав Саран

[UIFont fontWithName:@"HelveticaNeue" size:17.0f]
pbibergal

Будь-які ідеї, які можуть призвести до того, що це не допоможе? В якості експерименту я встановив для кольору тексту зелений, але все залишається за замовчуванням (сірий текст на блідо-сірому фоні або білий текст на синьому фоні, якщо виділено. Це iOS6. IOS7 за замовчуванням білий / прозорий.) Дякую!
Olie,

детальний опис наведено на datacalculation.blogspot.in/2014/10/…
Тест iOS

10
Тестуючи на iOS 8.1, останній рядок до цієї відповіді повинен змінитися з UIControlStateHighlightedна, UIControlStateSelectedщоб досягти бажаного ефекту.
прагне вчитися

87

Якщо вам потрібно змінити колір тексту виділеного сегмента в iOS 7, ось рішення (знайшов мене трохи часу, але завдяки цій публікації ):

Завдання-C

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

Стрімкий

  let titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]  
  UISegmentedControl.appearance().setTitleTextAttributes(titleTextAttributes, forState: .Selected)

Чудово. Ви можете стежити за детальною інформацією за адресою datacalculation.blogspot.in/2014/10/…
Тест iOS

Ця відповідь нарешті допомогла мені виконати вимоги до кнопки вибору мого додатка, раніше включаючи спосіб збереження сегментованого контролю у суперпогляді, щоб зробити межу квадратною ...
KoreanXcodeWorker

Для Свіфта 5:var titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white] UISegmentedControl.appearance().setTitleTextAttributes(titleTextAttributes, for: .normal)
Ерік

55

код для встановлення чорного кольору шрифту обох станів

Стрімкий 5

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

Стрімкий 4

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

Чи не працює прошивкою 13 і Swift 5, Xcode не розпізнає segmentedControlбільше
Sky

1
@Sky, просто додай трохи виправлення помилок у моєму додатку segmentedControl сьогодні, і це рішення працює на iOS 13.2 та Swift5.
ChuckZHB

31

Нижче наведено код для встановлення шрифту жирного шрифту та розміру точки:

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

Сподіваюся, це допоможе


4
Увага: для цієї відповіді потрібен iOS 5.
Костік,

1
Ця відповідь не змінює колір шрифту, як того вимагав запуск теми, лише розмір шрифту. Відповідь pbibergal є більш повною.
Terrabythia

Це працює, але попередження щодо UITextAttributeFont застаріло. Натомість використовуйте "NSFontAttributeName". Все завдяки @johngraham від stackoverflow.com/questions/2280391 / ...
Маверікс

15

Оновлено для iOS 14 та 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)
    }
}

Оновлено для Swift 4 - Використовуйте це розширення (адже розширення завжди чудове .. !!)

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

а з відповідного класу ви можете використовувати ці функції,

@IBOutlet weak var segment: UISegmentedControl!

segment.defaultConfiguration()
// or provide paramater as per your requirement
segment.selectedConfiguration(color: .blue)

6
for (UIView *v in [[[segment subviews] objectAtIndex:0] subviews]) {
    if ([v isKindOfClass:[UILabel class]]) {
        UILabel *label=(UILabel *)[v retain];
        lable.textColor=[UIColor blackColor];
    }
}

для iOS 3.0 та новіших версій


6
Попередження: не слід зберігати ярлик.
Costique

5

Про всяк випадок, щоб допомогти комусь іншому, хто туди потрапив і працює за допомогою швидкого.

Я запропоную два можливі способи зробити це. Ви можете змінити атрибути тексту UIAppearanceв сегментованому або безпосередньо у вашому робочому місці.

Перший приклад встановлення атрибутів у зовнішньому вигляді, таким чином ви налаштуєте всі сегментовані елементи керування у своїй програмі:

    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)

Другий приклад, безпосередньо в сегментованому, налаштує лише цей сегментований:

    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)

5

Розширення Swift 5

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

}

4

швидкий 3.2:

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

Примітка: якщо ви використовуєте власний колір тла, ви побачите збій у кутах (колір буде заповнювати зовнішні сегменти ..), тому використовуйте цей рядок, щоб відсікти його:

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

4

у Swift 5 ви можете змінити колір за допомогою цього синтаксису

Стрімкий 5

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

2

У iOS 5.0 і пізніших версіях ви можете використовувати titleTextAttributes для налаштування UISegmentedControlоб'єктів:

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

Тут я встановлюю шрифт на власний шрифт, розмір шрифту, колір для кожного стану UISegmentedControl.

Ви знайдете всі можливі прості налаштування в розділі Налаштування зовнішнього вигляду посилання на клас UISegmentedControl.


1

Я використовую монотуш. Не знаю чому, але коли натиснули на View, колір тексту для мене не змінився. для вирішення цього питання просто додайте мітки до сегмента керування контролем, а потім змініть їх кольори:

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

а потім використовувати його

segmented.SetColoredTittles(new string[] {
            "text1",
            "text2",
            "text3"
        }, UIColor.White,UIColor.DarkGray);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.