Подтвердить что ты не робот

Как настроить собственный шрифт для всего приложения iOS без указания размера

Я пытаюсь применить собственный шрифт на протяжении всего iOS app. Я обнаружил, что могу использовать:

 [[UILabel appearance] setFont:[UIFont fontWithName:@"Proxima Nova" size:17.0]];
  • Чтобы установить шрифт и размер по умолчанию для всех UILabels. Однако не все мои теги UILabels имеют одинаковый размер шрифта.

  • В Установите шрифт по умолчанию для всего приложения iOS?, у кого-то была такая же проблема, и ему сказали установить параметр размера 0.0, чтобы установить только шрифт, а не размер шрифта.

  • Когда я попытался это сделать, весь текст UILabel в моем приложении исчез (потому что, очевидно, iOS взял размер шрифта 0.0 буквально).

Любые предложения относительно того, как я могу универсально установить шрифт, но не размер? Большое спасибо!

4b9b3361

Ответ 1

- (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];
        }
    }    
}

Ответ 2

Вот решение в Objective-C, поместите эту категорию в любом месте, где хотите изменить UILabel Apperance без установки UILabel FontSize:

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

Затем вы можете изменить Apperance на:

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

Ответ 3

Я использовал принятый ответ в своем проекте, но нуждался в более общей функции, поэтому он изменит шрифт на каждый возможный, также я решил установить сопоставление некоторых фондовых шрифтов с нашими пользовательскими шрифтами, поэтому они будут доступны через файлы storybuilder и 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];
        }
    }
}

Ответ 4

Написав категорию для метки, мы можем изменить шрифты всего приложения.

@implementation UILabel (CustomeFont)

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

@end

Ответ 5

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

вы не можете установить внешний вид шрифта ярлыка, который заставляет меня создавать другое значение шрифта по умолчанию, и когда я устанавливаю новый шрифт, я получаю только имя нового шрифта и старого размера метки и создаю другой шрифт и устанавливаю этот шрифт

    //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)
        }
    }
     }

Ответ 6

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: без цвета:

#import "UIView+DefaultFontAndColor.h"

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

@usage: с цветом:

#import "UIView+DefaultFontAndColor.h"

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