如何在不指定大小的情况下为整个iOS应用程序设置自定义字体

我试图在我的iOS app自定义字体。 我发现我可以使用:

  [[UILabel appearance] setFont:[UIFont fontWithName:@"Proxima Nova" size:17.0]]; 
  • 设置所有UILabels的默认字体和大小。 但是,并不是所有的UILabels都有相同的字体大小。

  • 在整个iOS应用程序设置一个默认字体? ,有人有同样的担心,并被告知设置大小参数为0.0只设置字体,而不是字体大小。

  • 当我尝试这样做,我的应用程序中的所有UILabel文本消失(因为显然iOS从字面上0.0字体大小)。

任何build议,如何我可以普遍设置字体,但不是大小? 非常感谢!

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

这里是Objective-C的一个解决scheme,把这个类别放在任何你想改变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"]; 

我在我的项目中使用了接受的答案,但需要一个更通用的函数,所以它会改变字体到每一个可能的,我也select设置一些股票字体之间的映射到我们的自定义字体,所以他们也可以通过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]; } } } 

通过编写标签的类别,我们可以改变整个应用程序的字体。

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

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

你不能设置标签字体的外观,使我创build其他值的默认字体,当我设置新的字体,我只得到新的字体和标签的旧尺寸的名称,并创build其他字体,并设置此字体

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

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