Comment définir une police personnalisée pour l'ensemble de l'application iOS sans spécifier la taille

j'essaie d'appliquer une police personnalisée dans mon iOS app . J'ai trouvé que je pouvais utiliser:

 [[UILabel appearance] setFont:[UIFont fontWithName:@"Proxima Nova" size:17.0]];
  • pour définir la police et la taille par défaut pour tous les UILabels . Cependant, tous mes UILabels ne partagent pas la même taille de police.

  • Dans Définir une police par défaut pour l'ensemble de l'application iOS? , quelqu'un avait la même préoccupation, et on lui a dit de régler le paramètre taille à 0,0 à seulement définir la police et pas la taille de la police.

  • quand j'ai essayé de faire cela, tout le texte UILabel dans mon application a disparu (parce que évidemment iOS a pris la taille de police 0.0 littéralement).

des suggestions quant à la façon dont je peux universellement définir une police mais pas la taille? Merci beaucoup!

31
demandé sur Community 2012-08-10 23:06:09

7 réponses

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setFontFamily:@"FagoOfficeSans-Regular" forView:self.view andSubViews:YES];
}

-(void)setFontFamily:(NSString*)fontFamily forView:(UIView*)view andSubViews:(BOOL)isSubViews
{
    if ([view isKindOfClass:[UILabel class]])
    {
        UILabel *lbl = (UILabel *)view;
        [lbl setFont:[UIFont fontWithName:fontFamily size:[[lbl font] pointSize]]];
    }

    if (isSubViews)
    {
        for (UIView *sview in view.subviews)
        {
            [self setFontFamily:fontFamily forView:sview andSubViews:YES];
        }
    }    
}
23
répondu Raegtime 2012-08-27 10:18:34

Voici une solution dans L'objectif-C, mettez ce catégorie n'importe où vous voulez changer UILabel Apperance sans fixer UILabel FontSize :

@implementation UILabel (SubstituteFontName)
- (void)setSubstituteFontName:(NSString *)name UI_APPEARANCE_SELECTOR {
    self.font = [UIFont fontWithName:name size:self.font.pointSize];
}
@end

alors, vous pouvez changer le Apperance avec:

[[UILabel appearance] setSubstituteFontName:@"SourceSansPro-Light"];
18
répondu Damien Debin 2015-04-16 13:53:50

j'ai utilisé la réponse acceptée dans mon projet, mais j'avais besoin d'une fonction plus générique, donc il va changer la police à tous les possibles, aussi j'ai choisi de mettre une correspondance entre certaines polices de stock à nos polices personnalisées, donc ils seront accessibles via storybuilder et les fichiers xib aussi.

+ (void)setupFontsForView:(UIView *)view andSubViews:(BOOL)isSubViews
{
    if ([view respondsToSelector:@selector(setFont:)] && [view respondsToSelector:@selector(font)]) {
        id      viewObj = view;
        UIFont  *font   = [viewObj font];

        if ([font.fontName isEqualToString:@"AcademyEngravedLetPlain"]) {
            [viewObj setFont:[UIFont fontWithName:PRIMARY_FONT size:font.pointSize]];
        } else if ([font.fontName hasPrefix:@"AmericanTypewriter"]) {
            [viewObj setFont:[UIFont fontWithName:SECONDARY_FONT size:font.pointSize]];
        }
    }

    if (isSubViews) {
        for (UIView *sview in view.subviews) {
            [self setupFontsForView:sview andSubViews:YES];
        }
    }
}
12
répondu marmor 2013-04-30 20:50:34

en écrivant la catégorie pour L'étiquette nous pouvons changer les polices de l'application entière.

@implementation UILabel (CustomeFont)

-(void)awakeFromNib
{
    [super awakeFromNib];
    [self setBackgroundColor:[UIColor clearColor]];
    [self setFont:[UIFont fontWithName:@"Helvetica" size:self.font.pointSize]];
}

@end
7
répondu aViNaSh 2014-04-24 09:15:14

Swift3 https://gist.github.com/dimohamdy/c47992e14c1a3ee3315c06e2480e121e

vous ne pouvez pas définir l'apparence pour la police étiquette qui me fait créer une autre valeur de la police par défaut et quand je mets la nouvelle police je reçois seulement le nom de la nouvelle police et l'ancienne taille de l'étiquette et de créer une autre police et mettre cette police

    //when you want to set font for all labels in Application
    UILabel.appearance().defaultFont =  UIFont.systemFont(ofSize: 15/*Any Value*/, weight: UIFontWeightThin)

extension UILabel{
    dynamic var defaultFont: UIFont? {
        get { return self.font }
        set {
          //get old size of lable font
          let sizeOfOldFont = self.font.pointSize 
          //get new name  of font
          let fontNameOfNewFont = newValue?.fontName
          self.font = UIFont(name: fontNameOfNewFont!, size: sizeOfOldFont)
        }
    }
     }
5
répondu dimo hamdy 2016-09-29 10:51:47

UIView+DefaultFontAndColor.h

#import <UIKit/UIKit.h>

@interface UIView (DefaultFontAndColor)

-(void)setDefaultFontFamily:(NSString*)fontFamily andSubViews:(BOOL)isSubViews andColor:(UIColor*) color;
@end

UIView+DefaultFontAndColor.m

#import "UIView+DefaultFontAndColor.h"

@implementation UIView (DefaultFontAndColor)

//sets the default font for view classes by default
-(void)setDefaultFontFamily:(NSString*)fontFamily andSubViews:(BOOL)isSubViews andColor:     (UIColor*) color
{
    if ([self isKindOfClass:[UILabel class]])
    {
        UILabel *lbl = (UILabel *)self;
        [lbl setFont:[UIFont fontWithName:fontFamily size:[[lbl font] pointSize]]];

        if( color )
            lbl.textColor = color;
    }
    else if ([self isKindOfClass:[UIButton class]])
    {
        UIButton *btn = (UIButton *)self;
        [btn.titleLabel setFont:[UIFont fontWithName:fontFamily size:[[btn.titleLabel font] pointSize]]];

        if( color )
        {
            btn.tintColor = color;
        }
    }

    if (isSubViews)
    {
        for (UIView *sview in self.subviews)
        {
            [sview setDefaultFontFamily:fontFamily andSubViews:YES andColor:color];
        }
    }
}
@end

@usage: sans couleur:

#import "UIView+DefaultFontAndColor.h"

UIView myView = [[UIView alloc] init]
[myView setDefaultFontFamily:@"Arial" andSubViews:YES andColor:nil];

@usage: avec couleur:

#import "UIView+DefaultFontAndColor.h"

UIView myView = [[UIView alloc] init]
[myView setDefaultFontFamily:@"Arial" andSubViews:YES andColor:[UIColor greenColor] ];
3
répondu Peter Kreinz 2014-07-22 23:27:37

réponse de Raegtime ala Swift...

import UIKit

extension UIViewController {
    func setFontFamilyForView(_ fontFamily: String, view: UIView, andSubviews: Bool) {
        if let label = view as? UILabel {
            label.font = UIFont(name: fontFamily, size: label.font.pointSize)
        }

        if let textView = view as? UITextView {
            textView.font = UIFont(name: fontFamily, size: textView.font!.pointSize)
        }

        if let textField = view as? UITextField {
            textField.font = UIFont(name: fontFamily, size: textField.font!.pointSize)
        }

        if andSubviews {
            for v in view.subviews {
                setFontFamilyForView(fontFamily, view: v, andSubviews: true)
            }
        }
    }
}
0
répondu loglesby 2018-02-24 15:54:46