Изменить размер шрифта UISegmentedControl

222

Может кто-нибудь сказать, пожалуйста, как я могу изменить тип и размер шрифта UISegmentedControl?

Аашутош Тивари
источник
1
Какие-нибудь решения в IB вместо кода?
okysabeni

Ответы:

502

Я столкнулся с той же проблемой. Этот код устанавливает размер шрифта для всего сегментированного элемента управления. Нечто подобное может работать для установки типа шрифта. Обратите внимание, что это доступно только для iOS5 +

Obj C :

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

РЕДАКТИРОВАТЬ: UITextAttributeFontустарела - используйте NSFontAttributeNameвместо.

РЕДАКТИРОВАТЬ # 2: Для Swift 4 NSFontAttributeNameбыл изменен на NSAttributedStringKey.font.

Свифт 5 :

let font = UIFont.systemFont(ofSize: 16)
segmentedControl.setTitleTextAttributes([NSAttributedString.Key.font: font], for: .normal)

Свифт 4 :

let font = UIFont.systemFont(ofSize: 16)
segmentedControl.setTitleTextAttributes([NSAttributedStringKey.font: font],
                                        for: .normal)

Свифт 3 :

let font = UIFont.systemFont(ofSize: 16)
segmentedControl.setTitleTextAttributes([NSFontAttributeName: font],
                                        for: .normal)

Swift 2.2 :

let font = UIFont.systemFontOfSize(16)
segmentedControl.setTitleTextAttributes([NSFontAttributeName: font], 
    forState: UIControlState.Normal)

Благодаря реализации Swift от @ audrey-gordeev

johngraham
источник
4
Это прекрасно работает, хотя, если я уже сделал a, [mySegmentedControl setTintColor:onColor forTag:kTagOnState];а [mySegmentedControl setTintColor:offColor forTag:kTagOffState];затем применил [mySegmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];тогда, то цвета, которые я только что установил, исчезли.
scooter133
3
доступно в iOS 5.0 или более поздней
версии
8
в iOS7:NSDictionary *attributes = @{NSFontAttributeName: [UIFont boldsystemFontOfSize:12.0f]};
Джейсон Мур
2
@JasonMoore boldSystemFontOfSize:(заглавная S для Системы)
Гийом
1
Работает угощение в iOS 8. Напомните еще раз, ПОЧЕМУ нет атрибута "шрифта" ...? (У Apple есть много объяснений, чтобы сделать ...!)
Майк Гледхилл
52

Используйте API внешнего вида в iOS 5.0+:

[[UISegmentedControl appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"STHeitiSC-Medium" size:13.0], UITextAttributeFont, nil] forState:UIControlStateNormal];

Ссылки: http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIAppearance_Protocol/Reference/Reference.html#//apple_ref/doc/uid/TP40010906

http://www.raywenderlich.com/4344/user-interface-customization-in-ios-5

Майкл Петерсон
источник
5
UITextAttributeFontустарел - используйте NSFontAttributeNameвместо этого.
Портлендский Бегун
6
Стоит заметить, что это изменит шрифт ALL UISegmentedControls.
Vive
36

Вот Swift-версия принятого ответа:

Свифт 3 :

let font = UIFont.systemFont(ofSize: 16)
segmentedControl.setTitleTextAttributes([NSFontAttributeName: font],
                                        for: .normal)

Swift 2.2 :

let font = UIFont.systemFontOfSize(16)
segmentedControl.setTitleTextAttributes([NSFontAttributeName: font], 
    forState: UIControlState.Normal)
Андрей Гордеев
источник
13

Другой вариант - применить преобразование к элементу управления. Однако это уменьшит все, включая границы контроля.

segmentedControl.transform = CGAffineTransformMakeScale(.6f, .6f);
Даниил
источник
Благодаря этому простому рабочему коду. Масштабирование до .75f в iOS6 обеспечивает лучший результат. Если используется в ячейке таблицы, добавьте 10 к высоте ячейки.
kjoelbro
1
Это не способ изменить размер шрифта на любом элементе управления в iOS. Аффинное преобразование в основном предназначено для анимации.
вахотм
1
Пожалуйста, не масштабируйте стандартные элементы управления.
Майкл Петерсон
@MichaelPeterson было бы неплохо иметь гораздо больше настраиваемых стандартных элементов управления, поэтому никому не нужно делать подобные взломы.
Запорожченко Александр
9

Свифт Стиль:

UISegmentedControl.appearance().setTitleTextAttributes(NSDictionary(objects: [UIFont.systemFontOfSize(14.0)], forKeys: [NSFontAttributeName]), forState: UIControlState.Normal)
Питер Крейнз
источник
1
Вы должны использовать быстрый словарь стиля. [NSFontAttributeName: font]
Osrl
8

Здесь я обновил для iOS8

[[UISegmentedControl appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"STHeitiSC-Medium" size:13.0], NSFontAttributeName, nil] forState:UIControlStateNormal];
Картикеян
источник
7

XCode 8.1, Swift 3

import UIKit
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        UISegmentedControl.appearance().setTitleTextAttributes(NSDictionary(objects: [UIFont.systemFont(ofSize: 24.0)], 
        forKeys: [NSFontAttributeName as NSCopying]) as? [AnyHashable : Any], 
        for: UIControlState.normal)
    }
}

просто измените числовое значение (ofSize: 24.0)

предварительный просмотр

Хаш Хеш
источник
4
// Set font-size and font-femily the way you want
UIFont *objFont = [UIFont fontWithName:@"DroidSans" size:18.0f];

// Add font object to Dictionary
NSDictionary *dictAttributes = [NSDictionary dictionaryWithObject:objFont forKey:NSFontAttributeName];

// Set dictionary to the titleTextAttributes
[yourSegment setTitleTextAttributes:dictAttributes forState:UIControlStateNormal];

Если у вас есть какие-либо вопросы, свяжитесь со мной.

Politta
источник
objFont возвращает nilзначение.
Ицмебибин
3

C # / Xamarin:

segment.SetTitleTextAttributes(new UITextAttributes { 
    Font = UIFont.SystemFontOfSize(font_size) }, UIControlState.Normal);
t9mike
источник
3

Swift 4

let font = UIFont.systemFont(ofSize: 16)
UISegmentedControl.setTitleTextAttributes([NSFontAttributeName: font], for: .normal)
нарисовался..
источник
Ошибка: Instance member 'setTitleTextAttributes' cannot be used on type 'UISegmentedControl'; did you mean to use a value of this type instead? iOS13 / Swift5
Sky
2

Даниэль указал мне правильный путь. Я использовал это так

float scaleFactor = 0.8f;

UISegmentedControl *segmentedControl = [[UISegmentedControl alloc]
initWithFrame:CGRectMake(10, 70, 300/scaleFactor,35)];

[segmentedControl insertSegmentWithTitle:@"..." atIndex:0 animated:NO];
[segmentedControl insertSegmentWithTitle:@"..." atIndex:1 animated:NO];
[segmentedControl insertSegmentWithTitle:@"..." atIndex:2 animated:NO];

segmentedControl.transform = CGAffineTransformMakeScale(scaleFactor, 1);
CGPoint segmentedControlCenter = segmentedControl.center;
segmentedControlCenter.x = self.center.x;
segmentedControl.center = segmentedControlCenter;
Ved
источник
1

Расширение для UISegmentedControlнастройки размера шрифта.

extension UISegmentedControl {
    @available(iOS 8.2, *)
    func setFontSize(fontSize: CGFloat) {
            let normalTextAttributes: [NSObject : AnyObject]!
            if #available(iOS 9.0, *) {
                normalTextAttributes = [
                    NSFontAttributeName: UIFont.monospacedDigitSystemFontOfSize(fontSize, weight: UIFontWeightRegular)
                ]
            } else {
                normalTextAttributes = [
                    NSFontAttributeName: UIFont.systemFontOfSize(fontSize, weight: UIFontWeightRegular)
                ]
            }

        self.setTitleTextAttributes(normalTextAttributes, forState: .Normal)
    }
 }
GameBegins
источник
1
 UISegmentedControl.appearance().setTitleTextAttributes(NSDictionary(objects: [UIFont.systemFont(ofSize: 16.0)],
                                                                        forKeys: [kCTFontAttributeName as! NSCopying]) as? [AnyHashable : Any],
                                                           for: UIControlState.normal)
Davender Verma
источник
Хотя этот код может ответить на этот вопрос, предоставление информации о том, как и почему он решает проблему, повышает ее долгосрочную ценность
L_J
1

В swift 5,

let font = UIFont.systemFont(ofSize: 16)
UISegmentedControl.appearance().setTitleTextAttributes([NSAttributedString.Key.font: font], for: .normal)
Кодирование во время загрузки
источник
0

Вы можете получить фактический шрифт для UILabel, рекурсивно исследуя каждое из представлений, начиная с UISegmentedControl. Я не знаю, является ли это лучшим способом сделать это, но это работает.

@interface tmpSegmentedControlTextViewController : UIViewController {
}

@property (nonatomic, assign) IBOutlet UISegmentedControl * theControl;

@end

@implementation tmpSegmentedControlTextViewController

@synthesize theControl; // UISegmentedControl

- (void)viewDidLoad {
  [self printControl:[self theControl]];
  [super viewDidLoad];
}

- (void) printControl:(UIView *) view {
  NSArray * views = [view subviews];
  NSInteger idx,idxMax;
  for (idx = 0, idxMax = views.count; idx < idxMax; idx++) {
    UIView * thisView = [views objectAtIndex:idx];
    UILabel * tmpLabel = (UILabel *) thisView;
    if ([tmpLabel respondsToSelector:@selector(text)]) {
      NSLog(@"TEXT for view %d: %@",idx,tmpLabel.text);
      [tmpLabel setTextColor:[UIColor blackColor]];
    }

    if (thisView.subviews.count) {
      NSLog(@"View has subviews");
      [self printControl:thisView];
    }
  }
}

@end

В приведенном выше коде я просто устанавливаю цвет текста UILabel, но я полагаю, вы также можете получить или установить свойство шрифта.

Primc
источник
Это отличный способ убедиться, что обновление iOS не нарушит код, который вы отправили своим клиентам. Это может сработать сейчас, но нет абсолютно никаких гарантий, что это продолжит работать в будущем.
Апурв Хатреджа
0

это для цели c добавить ваше сегментированное имя элемента управления вместо mysegmentedcontrol

UIFont *font = [UIFont systemFontOfSize:11.0f];

NSDictionary *attributes = [NSDictionary dictionaryWithObject:font
                                                            forKey:UITextAttributeFont];

[mySegmentedcontrol setTitleTextAttributes:attributes                                    forState:UIControlStateNormal];

Надеюсь, поможет

Гопинатх
источник
1
- обновить - NSDictionary * attribute = @ {NSFontAttributeName: font}; [mySegmentedcontrol setTitleTextAttributes: attribute forState: UIControlStateNormal];
Бенни Давидович