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


Ответы:


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


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

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


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

3

C # / Xamarin:

segment.SetTitleTextAttributes(new UITextAttributes { 
    Font = UIFont.SystemFontOfSize(font_size) }, UIControlState.Normal);

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;

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

1
 UISegmentedControl.appearance().setTitleTextAttributes(NSDictionary(objects: [UIFont.systemFont(ofSize: 16.0)],
                                                                        forKeys: [kCTFontAttributeName as! NSCopying]) as? [AnyHashable : Any],
                                                           for: UIControlState.normal)

Хотя этот код может ответить на этот вопрос, предоставление информации о том, как и почему он решает проблему, повышает ее долгосрочную ценность
L_J


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, но я полагаю, вы также можете получить или установить свойство шрифта.


Это отличный способ убедиться, что обновление 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];
Бенни Давидович
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.