Вопрос по iphone, objective-c, uikit, ios, cocoa – Как установить собственный шрифт для всего приложения iOS без указания размера

32

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

 [[UILabel appearance] setFont:[UIFont fontWithName:@"Proxima Nova" size:17.0]];

To set the default font and size for all UILabels. However, not all my UILabels share the same font size.

In Set a default font for whole iOS app?, someone had the same concern, and was told to set the size parameter to 0.0 to only set the font and not font size.

When I tried doing this, all the UILabel text in my app disappeared (because evidently iOS took the 0.0 font size literally).

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

Ваш Ответ

7   ответов
3

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

мы можем изменить шрифты всего приложения.

@implementation UILabel (CustomeFont)

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

@end
Вам настоятельно не рекомендуется переопределять методы класса. По крайней мере, нет способа вызвать исходную реализацию.
2

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)
            }
        }
    }
}
В чем ваша проблема? Невозможно отредактировать ответ, потому что он не мой, не удалось добавить этот фрагмент в комментарий из-за ограничения по количеству символов. Я нашел этот вопрос, хотя я работаю в Swift, так что, очевидно, другие тоже. Я думал, что этот фрагмент может быть полезным для них. У вас нет ничего лучше, чем избивать людей за попытки помочь другим?
Если вы хотите добавить версию ответа Swift, отредактируйте исходный ответ, пожалуйста. Не создавайте новый ответ Swift. В любом случае, это объективный вопрос.
Нет необходимости иметь два одинаковых ответа на разных языках. Даже если ответ не ваш, вы можете отредактировать его, если у вас достаточно репутации, или если вы не добавили комментарий, запрашивающий версию Swift. Это поможет другим пользователям больше, чем просто добавление нового ответа. Добавление нового ответа должно быть последним средством, а не первым.
19

category везде, где вы хотите изменить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"];
Как использовать это в Swift Appdelegate?
Удивительно!! Спасибо
Небольшая информация для любопытных разработчиков: & quot; UIAppearance ищет макрос UI_APPEARANCE_SELECTOR в сигнатурах методов. Любой метод с этой аннотацией может использоваться с прокси внешнего вида. & Quot;http://nshipster.com/uiappearance/
Это работает и экономит много времени! Благодарю вас !!
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];
        }
    }
}
5

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)
        }
    }
     }
@JamesK, пожалуйста, проверьте это обновление
Вы можете улучшить свой ответ, объяснив, как он работает.
23
- (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];
        }
    }    
}
Это может быть лучшим, что вы можете сделать, но другая вещь, к которой это решение не относится, - это другой стиль шрифта, такой как жирный шрифт или курсив, когда у вас есть отдельное семейство для этих шрифтов, такое как FagoOfficeSans-Bold.
+1 Однако этот подход не работает, если ваше приложение использует UITableView. Этикетки не будут обновляться в отдельных ячейках.
Да, но что с того? Обработка UILabels в UITableViewCells, независимо от того, являются ли они пользовательскими или встроенными, зависит от одной строки текста в методе cellForRowAtIndexPath вашей таблицы.

Похожие вопросы