web-dev-qa-db-fra.com

Comment définir une police personnalisée pour une application iOS entière sans spécifier de taille

J'essaie d'appliquer une police personnalisée à travers mon iOS app. J'ai trouvé que je pourrais utiliser:

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

  • Dans Définir une police par défaut pour toute l'application iOS? , quelqu'un avait le même problème et on lui a dit de régler le paramètre size à 0.0 pour définir uniquement la police et non sa taille. 

  • Lorsque j'ai essayé de le faire, tout le texte UILabel de mon application a disparu (car il est évident que iOS a pris littéralement la taille de la police 0.0). 

Avez-vous des suggestions quant à la manière de définir une police de caractère, mais pas sa taille? Merci beaucoup!

32
Janum Trivedi
- (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
Raegtime

Voici une solution dans Objective-C, mettez cette catégorie où que vous vouliez changer UILabelApperance sans définir UILabelFontSize:

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

Ensuite, vous pouvez changer la Apperance avec:

[[UILabel appearance] setSubstituteFontName:@"SourceSansPro-Light"];
19
Damien Debin

J'ai utilisé la réponse acceptée dans mon projet, mais j'avais besoin d'une fonction plus générique, donc la police sera modifiée dans la mesure du possible. J'ai également choisi de définir un mappage entre certaines polices de stock et nos polices personnalisées. Sera également accessible via les fichiers storybuilder et xib.

+ (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
marmor

En écrivant la catégorie pour le Label, 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
aViNaSh

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

vous ne pouvez pas définir l'apparence de la police d'étiquette qui me fait créer une autre valeur de police par défaut et lorsque je définis la nouvelle police, je n'obtiens que le nom de la nouvelle police et l'ancienne taille de l'étiquette, puis crée une autre police et définit 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
dimo hamdy

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
Peter Kreinz

La 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)
            }
        }
    }
}
1
loglesby