Modifier la taille de police de UISegmentedControl

222

Quelqu'un peut-il me dire comment changer le type et la taille de la police UISegmentedControl?

Aashutosh Tiwari
la source
1
Des solutions en IB au lieu de code?
okysabeni

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

johngraham
la source
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

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

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

Politta
la source
objFont renvoie une nilvaleur.
itzmebibin
3

C # / Xamarin:

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

Swift 4

let font = UIFont.systemFont(ofSize: 16)
UISegmentedControl.setTitleTextAttributes([NSFontAttributeName: font], for: .normal)
a dessiné..
la source
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;
Ved
la source
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)
    }
 }
GameBegins
la source
1
 UISegmentedControl.appearance().setTitleTextAttributes(NSDictionary(objects: [UIFont.systemFont(ofSize: 16.0)],
                                                                        forKeys: [kCTFontAttributeName as! NSCopying]) as? [AnyHashable : Any],
                                                           for: UIControlState.normal)
Davender Verma
la source
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)
Codage pendant le chargement
la source
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.

Primc
la source
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

gopinath
la source
1
- mise à jour - NSDictionary * attributes = @ {NSFontAttributeName: font}; [mySegmentedcontrol setTitleTextAttributes: attributs forState: UIControlStateNormal];
Benny Davidovitz