Modifier la taille de police de UISegmentedControl


Réponses:


502

J'ai rencontré le même problème. Ce code définit la taille de police pour l'ensemble du contrôle segmenté. Quelque chose de similaire pourrait fonctionner pour définir le type de police. Notez que cela n'est disponible que pour iOS5 +

Obj C :

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

EDIT: UITextAttributeFonta été déconseillé - utiliser à la NSFontAttributeNameplace.

EDIT # 2: pour Swift 4 NSFontAttributeNamea été changé en 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)

Merci aux implémentations Swift de @ audrey-gordeev


4
Cela fonctionne très bien, mais si j'ai déjà fait un [mySegmentedControl setTintColor:onColor forTag:kTagOnState];et [mySegmentedControl setTintColor:offColor forTag:kTagOffState];puis appliquer [mySegmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];les couleurs que je viens de définir disparaissent.
scooter133

3
disponible dans iOS 5.0 ou version ultérieure
rakeshNS

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

2
@JasonMoore boldSystemFontOfSize:(S majuscule pour System)
Guillaume

1
Fonctionne un régal dans iOS 8. Rappelez-moi encore, POURQUOI n'y a-t-il pas d'attribut "police" ...? (Apple a beaucoup d'explications à faire ...!)
Mike Gledhill

52

Utilisez l'API d'apparence dans iOS 5.0+:

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

Liens: 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
UITextAttributeFonta été amorti - utilisez NSFontAttributeNameplutôt.
Portland Runner

6
Il convient de noter que cela changera la police de TOUS UISegmentedControlles.
Vive le

36

Voici une version Swift de la réponse acceptée:

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

Une autre option consiste à appliquer une transformation au contrôle. Cependant, il réduira tout, y compris les frontières de contrôle.

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

Merci à ce code de travail simple. La mise à l'échelle à .75f dans iOS6 fournit le meilleur résultat. S'il est utilisé dans une cellule de tableau, ajoutez 10 à la hauteur de la cellule.
kjoelbro

1
Ce n'est pas ainsi que vous modifiez la taille de la police sur n'importe quel contrôle dans iOS. La transformation affine est principalement destinée à être utilisée avec des animations.
vahotm

1
Veuillez ne pas mettre à l'échelle les contrôles standard.
Michael Peterson

@MichaelPeterson serait bien d'avoir des contrôles standard beaucoup plus personnalisables, donc personne n'a besoin de pirater comme celui-ci.
Zaporozhchenko Oleksandr

9

Style rapide:

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

1
Vous devez utiliser un dictionnaire de style rapide. [NSFontAttributeName: font]
osrl

8

Ici, j'ai mis à jour pour 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)
    }
}

il suffit de changer la valeur numérique (ofSize: 24.0)

Aperçu


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 vous avez des questions, contactez-moi.


objFont renvoie une nilvaleur.
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)

Erreur: 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 m'a montré la bonne voie. Je l'ai utilisé comme ça-

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

Extension pour UISegmentedControldéfinir la taille de police.

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)

Bien que ce code puisse répondre à la question, fournir des informations sur comment et pourquoi il résout le problème améliore sa valeur à long terme
L_J

1

Dans swift 5,

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

0

Vous pouvez obtenir la police réelle pour UILabel en examinant récursivement chacune des vues en commençant par UISegmentedControl. Je ne sais pas si c'est la meilleure façon de le faire, mais ça marche.

@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

Dans le code ci-dessus, je ne fais que définir la couleur du texte de l'UILabel, mais vous pouvez également saisir ou définir la propriété de la police, je suppose.


C'est un excellent moyen de s'assurer qu'une mise à jour iOS cassera le code que vous avez envoyé à vos clients. Cela pourrait fonctionner maintenant, mais il n'y a absolument aucune garantie que cela continuera de fonctionner à l'avenir.
Apoorv Khatreja

0

c'est pour l'objectif c ajoutez votre nom de contrôle segmenté à la place de mysegmentedcontrol

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

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

[mySegmentedcontrol setTitleTextAttributes:attributes                                    forState:UIControlStateNormal];

J'espère que ça aide


1
- mise à jour - NSDictionary * attributes = @ {NSFontAttributeName: font}; [mySegmentedcontrol setTitleTextAttributes: attributs forState: UIControlStateNormal];
Benny Davidovitz
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.