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

johngraham
fuente
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

Michael Peterson
fuente
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)
Andrey Gordeev
fuente
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);
Daniel
fuente
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)
Peter Kreinz
fuente
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];
karthikeyan
fuente
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

HÄsh HÄsh
fuente
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.

Politta
fuente
objFont devuelve nilvalor.
itzmebibin
3

C # / Xamarin:

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

Swift 4

let font = UIFont.systemFont(ofSize: 16)
UISegmentedControl.setTitleTextAttributes([NSFontAttributeName: font], for: .normal)
dibujó..
fuente
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;
Ved
fuente
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)
    }
 }
GameBegins
fuente
1
 UISegmentedControl.appearance().setTitleTextAttributes(NSDictionary(objects: [UIFont.systemFont(ofSize: 16.0)],
                                                                        forKeys: [kCTFontAttributeName as! NSCopying]) as? [AnyHashable : Any],
                                                           for: UIControlState.normal)
Davender Verma
fuente
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)
Codificación mientras se carga
fuente
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.

Primc
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

gopinath
fuente
1
- actualización - NSDictionary * atributos = @ {NSFontAttributeName: font}; [mySegmentedcontrol setTitleTextAttributes: atributos forState: UIControlStateNormal];
Benny Davidovitz el