Пользовательский шрифт можно использовать в раскадровке? - PullRequest
0 голосов
/ 01 февраля 2019

Есть ли способ использовать пользовательский шрифт в раскадровке?Намерение здесь состоит в том, чтобы охватить стили компонентов через саму раскадровку и отразить шрифт. Так что я могу перейти от FontA к FontB из одного места.Я знаю, что это можно сделать с помощью кода, но ограниченность заключается в том, что большая часть пользовательского интерфейса разработана в раскадровке, а многие торговые точки не созданы.

Мне просто интересно, возможно ли это?

Ответы [ 4 ]

0 голосов
/ 05 февраля 2019

Было два подхода, которые мы нашли на нашем пути: 1. Использование метода swizzling 2. Создание категории для UIFont и переопределение методов

#import "SystemFontOverride.h"

@implementation UIFont (SystemFontOverride)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
// do your override
+ (UIFont *)systemFontOfSize:(CGFloat)fontSize {
    UIFont *font = [UIFont fontWithName:@"Raleway-Regular" size:fontSize];
    if (font != nil) {
        return font;
    }
    return [UIFont systemFontOfSize:fontSize];
}

+ (UIFont *)boldSystemFontOfSize:(CGFloat)fontSize {
    UIFont *font = [UIFont fontWithName:@"Raleway-Bold" size:fontSize];
    if (font != nil) {
        return font;
    }
    return [UIFont systemFontOfSize:fontSize];
}
+ (UIFont *)italicSystemFontOfSize:(CGFloat)fontSize {
    UIFont *font = [UIFont fontWithName:@"Raleway-Italic" size:fontSize];
    if (font != nil) {
        return font;
    }
    return [UIFont systemFontOfSize:fontSize];
}

+ (UIFont *)systemFontOfSize:(CGFloat)fontSize weight:(UIFontWeight)weight NS_AVAILABLE_IOS(8_2) {
    NSString *fontName;
    if (weight == UIFontWeightSemibold) {
        fontName = @"Raleway-SemiBold";
    } else if (weight == UIFontWeightBold) {
        fontName = @"Raleway-Bold";
    } else if (weight == UIFontWeightRegular){
        fontName = @"Raleway-Regular";
    } else if (weight == UIFontWeightMedium){
        fontName = @"Raleway-Medium";
    } else if (weight == UIFontWeightThin){
        fontName = @"Raleway-Thin";
    } else if (weight == UIFontWeightBlack) {
        fontName = @"Raleway-Black";
    }
    if (fontName != nil && fontName.length > 0) {
        UIFont *font = [UIFont fontWithName:fontName size:fontSize];
        if (font != nil) {
            return font;
        }
    }
    return [UIFont systemFontOfSize:fontSize];
}

- (instancetype)initWithCoder:(NSCoder *)coder
    {
        if (self) {
            BOOL result = [coder containsValueForKey:@"UIFontDescriptor"];
            if (result) {
                UIFontDescriptor *descriptor = [coder decodeObjectForKey:@"UIFontDescriptor"];

                NSString *fontName;
                if ([descriptor.fontAttributes[@"NSCTFontUIUsageAttribute"] isEqualToString:@"CTFontRegularUsage"]) {
                    fontName = @"Raleway-Regular";
                }
                else if ([descriptor.fontAttributes[@"NSCTFontUIUsageAttribute"] isEqualToString:@"CTFontEmphasizedUsage"]) {
                    fontName = @"Raleway-Bold";
                }
                else if ([descriptor.fontAttributes[@"NSCTFontUIUsageAttribute"] isEqualToString:@"CTFontObliqueUsage"]) {
                    fontName = @"Raleway-Italic";
                }
                else {
                    fontName = descriptor.fontAttributes[@"NSFontNameAttribute"];
                }
                return [UIFont fontWithName:fontName size:descriptor.pointSize];
            }
        }
        return self;
    }


#pragma clang diagnostic pop
@end

Еще один улов был переопределить systemFont, который установлен в раскадровкенам нужно было реализовать initWithCoder.

Спасибо за все ваши ответы выше, но я нашел этот способ более эффективным и полным охватом за меньшее время.Теперь я могу создать свой enum шрифта и установить все, что я хочу изменить, не беспокоясь о том, установил ли я шрифт из раскадровки или код.

0 голосов
/ 01 февраля 2019

Да.Вы можете использовать пользовательские шрифты с раскадровкой.

Выполните следующие действия:

  • Включите ваши шрифты в проект XCode.
  • Убедитесь, что они включены вtarget.
  • Дважды проверьте, включены ли ваши шрифты в качестве ресурсов в ваш пакет.
  • Включите ваши пользовательские шрифты iOS в список приложений.
  • Найдите имяшрифт.

    Имя шрифта можно найти с помощью фрагмента кода:

    override func viewDidLoad() {
     super.viewDidLoad()
     for family: String in UIFont.familyNames
      {
        print(family)
        for names: String in UIFont.fontNames(forFamilyName: family)
        {
           print("== \(names)")
        }
       }
     }
    
  • Теперь вы можете использовать это имя шрифта и установить шрифт из раскадровки.

Проверьте это: https://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/

Это может помочь вам.

0 голосов
/ 01 февраля 2019

Да, вы можете использовать их из раскадровок.Добавьте файлы пользовательских шрифтов в ресурсы приложения и укажите их в info.plist.Здесь я добавляю bwnistageometricdemo-регулярно в info.plist.

<key>UIAppFonts</key> <array> <string>bwnistageometricdemo-regular.ttf</string> </array>

И вы можете использовать его из раскадровки, как -

enter image description here

0 голосов
/ 01 февраля 2019

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

  1. Добавьте файл шрифта в проект Xcode.
  2. Зарегистрируйте свой шрифт в Info.plist:
UIAppFonts : 
Item 0 : MyCustomFont.ttf

Ваш шрифт должен теперь отображатьсяв раскадровке.

Пожалуйста, обратитесь к Apple Docs для получения дополнительной информации.

...