Cambiar el tamaño de fuente de UISegmentedControl


Respuestas:


502

Me encontré con el mismo problema. Este código establece el tamaño de fuente para todo el control segmentado. Algo similar podría funcionar para configurar el tipo de fuente. Tenga en cuenta que esto solo está disponible para iOS5 +

Obj. C :

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

EDITAR: UITextAttributeFontha quedado en desuso; en su NSFontAttributeNamelugar, úselo.

EDITAR # 2: Para Swift 4 NSFontAttributeNamese ha cambiado a NSAttributedStringKey.font.

Swift 5 :

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

Swift 4 :

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

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)

Gracias a las implementaciones de Swift de @ audrey-gordeev


44
Esto funciona muy bien, aunque si ya he hecho una [mySegmentedControl setTintColor:onColor forTag:kTagOnState];y [mySegmentedControl setTintColor:offColor forTag:kTagOffState];luego aplicar las [mySegmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];entonces los colores que acaba de establecer desaparecen.
scooter133

3
disponible en iOS 5.0 o posterior
rakeshNS

8
en iOS7:NSDictionary *attributes = @{NSFontAttributeName: [UIFont boldsystemFontOfSize:12.0f]};
Jason Moore

2
@JasonMoore boldSystemFontOfSize:(S mayúscula para el sistema)
Guillaume

1
Funciona de maravilla en iOS 8. Recordarme de nuevo, ¿POR QUÉ no hay un atributo de "fuente" ...? (¡Apple tiene muchas explicaciones que hacer ...!)
Mike Gledhill

52

Use la API de apariencia en iOS 5.0+:

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

Enlaces: 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


55
UITextAttributeFontse ha depreciado; úsela en su NSFontAttributeNamelugar.
Portland Runner

66
Vale la pena notar que cambiará la fuente de TODOS UISegmentedControl.
Vive el

36

Aquí hay una versión rápida de la respuesta aceptada:

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

Otra opción es aplicar una transformación al control. Sin embargo, reducirá todo, incluidos los bordes de control.

segmentedControl.transform = CGAffineTransformMakeScale(.6f, .6f);

Gracias a este sencillo código de trabajo. Escalarlo a .75f en iOS6 proporciona el mejor resultado. Si se usa en una celda de la tabla, agregue 10 a la altura de la celda.
kjoelbro

1
Esta no es la forma en que cambia el tamaño de fuente en cualquier control en iOS. La transformación afina está destinada principalmente a ser utilizada con animaciones.
vahotm

1
Por favor no escale los controles estándar.
Michael Peterson

@MichaelPeterson sería bueno tener controles estándar mucho más personalizables, por lo que nadie necesita hackear como este.
Zaporozhchenko Oleksandr

9

Estilo rápido:

UISegmentedControl.appearance().setTitleTextAttributes(NSDictionary(objects: [UIFont.systemFontOfSize(14.0)], forKeys: [NSFontAttributeName]), forState: UIControlState.Normal)

1
Debes usar un diccionario de estilo rápido. [NSFontAttributeName: font]
osrl

8

Aquí he actualizado para 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)
    }
}

solo cambia el valor del número (ofSize: 24.0)

Avance


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

Si tiene alguna consulta, contácteme.


objFont devuelve nilvalor.
itzmebibin

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)

Error: Instance member 'setTitleTextAttributes' cannot be used on type 'UISegmentedControl'; did you mean to use a value of this type instead? iOS13 / Swift5
Sky

2

Daniel me señaló el camino correcto. Lo usé así

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

Extensión para UISegmentedControlconfigurar el tamaño de fuente.

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)

Si bien este código puede responder la pregunta, proporcionar información sobre cómo y por qué resuelve el problema mejora su valor a largo plazo
L_J

1

en swift 5,

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

0

Puede obtener la fuente real para el UILabel examinando recursivamente cada una de las vistas comenzando con el UISegmentedControl. No sé si esta es la mejor manera de hacerlo, pero funciona.

@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

En el código anterior, solo estoy configurando el color del texto de UILabel, pero supongo que también puedes tomar o configurar la propiedad de fuente.


Esta es una excelente manera de asegurarse de que una actualización de iOS rompa el código que ha enviado a sus clientes. Esto podría funcionar ahora, pero no hay absolutamente ninguna garantía de que continuará funcionando en el futuro.
Apoorv Khatreja

0

esto es para el objetivo c, agregue su nombre de control segmentado en lugar de mysegmentedcontrol

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

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

[mySegmentedcontrol setTitleTextAttributes:attributes                                    forState:UIControlStateNormal];

Espero eso ayude


1
- actualización - NSDictionary * atributos = @ {NSFontAttributeName: font}; [mySegmentedcontrol setTitleTextAttributes: atributos forState: UIControlStateNormal];
Benny Davidovitz el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.