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

Jan*_*edi 34 iphone cocoa objective-c uikit ios

我正试图在我的整个过程中应用自定义字体iOS app.我发现我可以使用:

 [[UILabel appearance] setFont:[UIFont fontWithName:@"Proxima Nova" size:17.0]];
Run Code Online (Sandbox Code Playgroud)
  • 设置所有的默认字体和大小UILabels.但是,并非所有我的UILabels共享字体都相同.

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

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

有关如何普遍设置字体而不是大小的任何建议?非常感谢!

Rae*_*ime 24

- (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];
        }
    }    
}
Run Code Online (Sandbox Code Playgroud)

  • +1但是,如果您的应用使用UITableView,此方法将失败.此过程不会更新单个单元格中的标签. (8认同)
  • 是的,但是那又怎样?处理UITableViewCells中的UILabel,无论它们是自定义的还是内置的,都是表格的cellForRowAtIndexPath方法中的一行文本. (4认同)

Dam*_*bin 19

这是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
Run Code Online (Sandbox Code Playgroud)

然后,您可以更改Apperance:

[[UILabel appearance] setSubstituteFontName:@"SourceSansPro-Light"];
Run Code Online (Sandbox Code Playgroud)

  • 奇怪开发人员的一小部分信息:"UIAppearance在方法签名中查找UI_APPEARANCE_SELECTOR宏.任何带有此批注的方法都可以与外观代理一起使用." [http://nshipster.com/uiappearance/](http://nshipster.com/uiappearance/) (3认同)

mar*_*mor 12

我在我的项目中使用了接受的答案,但是需要一个更通用的功能,所以它会将字体更改为每个可能的字体,我也选择设置一些字体字体到我们的自定义字体之间的映射,所以他们也可以通过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];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


aVi*_*aSh 7

通过编写Label的类别,我们可以更改整个应用程序的字体.

@implementation UILabel (CustomeFont)

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

@end
Run Code Online (Sandbox Code Playgroud)

  • 强烈建议您不要覆盖类方法.至少没有办法调用原始实现. (5认同)

dim*_*mdy 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)
        }
    }
     }
Run Code Online (Sandbox Code Playgroud)