Установить шрифт по умолчанию для всего приложения iOS?



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



есть ли способ установить шрифт по умолчанию (метки по умолчанию используют SystemFont) для всего приложения?

611   16  

16 ответов:

Кажется, что это возможно в iOS 5 с помощью прокси-сервера UIAppearance.

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

это будет установить шрифт, чтобы быть независимо от вашего пользовательского шрифта для всех UILabels в вашем приложении. Вам нужно будет повторить его для каждого элемента управления (UIButton, UILabel и т. д.).

помните, что вам нужно будет поместить значение UIAppFonts в свою информацию.plist и включите имя шрифта, который вы включаете.

существует также другое решение, которое будет переопределять systemFont.

просто создайте категорию

UIFont + SystemFontOverride.h

#import <UIKit/UIKit.h>

@interface UIFont (SystemFontOverride)
@end

UIFont + SystemFontOverride.м

@implementation UIFont (SystemFontOverride)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"

+ (UIFont *)boldSystemFontOfSize:(CGFloat)fontSize {
    return [UIFont fontWithName:@"fontName" size:fontSize];
}

+ (UIFont *)systemFontOfSize:(CGFloat)fontSize {
    return [UIFont fontWithName:@"fontName" size:fontSize];
}

#pragma clang diagnostic pop

@end

это заменит реализацию по умолчанию, и большинство UIControls используют systemFont.

Swift 4.1

основываясь на ответе Фабио Оливейры (https://stackoverflow.com/a/23042694/2082851), я делаю свой собственный swift 4.

короче говоря, это расширение обменивается функциями по умолчанию init(coder:),systemFont(ofSize:),boldSystemFont(ofSize:),italicSystemFont(ofSize:) С моими пользовательскими методами.

обратите внимание, что это не полная реализация, но вы можете обменять несколько базовых методов реализации.

import UIKit

struct AppFontName {
    static let regular = "CourierNewPSMT"
    static let bold = "CourierNewPS-BoldMT"
    static let italic = "CourierNewPS-ItalicMT"
}

extension UIFontDescriptor.AttributeName {
    static let nsctFontUIUsage = UIFontDescriptor.AttributeName(rawValue: "NSCTFontUIUsageAttribute")
}

extension UIFont {

    @objc class func mySystemFont(ofSize size: CGFloat) -> UIFont {
        return UIFont(name: AppFontName.regular, size: size)!
    }

    @objc class func myBoldSystemFont(ofSize size: CGFloat) -> UIFont {
        return UIFont(name: AppFontName.bold, size: size)!
    }

    @objc class func myItalicSystemFont(ofSize size: CGFloat) -> UIFont {
        return UIFont(name: AppFontName.italic, size: size)!
    }

    @objc convenience init(myCoder aDecoder: NSCoder) {
        guard
            let fontDescriptor = aDecoder.decodeObject(forKey: "UIFontDescriptor") as? UIFontDescriptor,
            let fontAttribute = fontDescriptor.fontAttributes[.nsctFontUIUsage] as? String else {
                self.init(myCoder: aDecoder)
                return
        }
        var fontName = ""
        switch fontAttribute {
        case "CTFontRegularUsage":
            fontName = AppFontName.regular
        case "CTFontEmphasizedUsage", "CTFontBoldUsage":
            fontName = AppFontName.bold
        case "CTFontObliqueUsage":
            fontName = AppFontName.italic
        default:
            fontName = AppFontName.regular
        }
        self.init(name: fontName, size: fontDescriptor.pointSize)!
    }

    class func overrideInitialize() {
        guard self == UIFont.self else { return }

        if let systemFontMethod = class_getClassMethod(self, #selector(systemFont(ofSize:))),
            let mySystemFontMethod = class_getClassMethod(self, #selector(mySystemFont(ofSize:))) {
            method_exchangeImplementations(systemFontMethod, mySystemFontMethod)
        }

        if let boldSystemFontMethod = class_getClassMethod(self, #selector(boldSystemFont(ofSize:))),
            let myBoldSystemFontMethod = class_getClassMethod(self, #selector(myBoldSystemFont(ofSize:))) {
            method_exchangeImplementations(boldSystemFontMethod, myBoldSystemFontMethod)
        }

        if let italicSystemFontMethod = class_getClassMethod(self, #selector(italicSystemFont(ofSize:))),
            let myItalicSystemFontMethod = class_getClassMethod(self, #selector(myItalicSystemFont(ofSize:))) {
            method_exchangeImplementations(italicSystemFontMethod, myItalicSystemFontMethod)
        }

        if let initCoderMethod = class_getInstanceMethod(self, #selector(UIFontDescriptor.init(coder:))), // Trick to get over the lack of UIFont.init(coder:))
            let myInitCoderMethod = class_getInstanceMethod(self, #selector(UIFont.init(myCoder:))) {
            method_exchangeImplementations(initCoderMethod, myInitCoderMethod)
        }
    }
}


class AppDelegate: UIResponder, UIApplicationDelegate {
    // Avoid warning of Swift
    // Method 'initialize()' defines Objective-C class method 'initialize', which is not guaranteed to be invoked by Swift and will be disallowed in future versions
    override init() {
        super.init()
        UIFont.overrideInitialize()
    }
    ...
}

если вы используете Swift, вы можете создать расширение UILabel:

extension UILabel {

    var substituteFontName : String {
        get { return self.font.fontName }
        set { self.font = UIFont(name: newValue, size: self.font.pointSize) }
    }

}

а потом, где вы делаете свой внешний вид проксирования:

UILabel.appearance().substituteFontName = applicationFont

существует эквивалентный код Objective-C с помощью UI_APPEARANCE_SELECTOR на свойство с именем substituteFontName.

дополнение

для случая, когда вы хотите установить жирный и обычный шрифты отдельно:

extension UILabel {

    var substituteFontName : String {
        get { return self.font.fontName }
        set { 
            if self.font.fontName.range(of:"Medium") == nil { 
                self.font = UIFont(name: newValue, size: self.font.pointSize)
            }
        }
    }

    var substituteFontNameBold : String {
        get { return self.font.fontName }
        set { 
            if self.font.fontName.range(of:"Medium") != nil { 
                self.font = UIFont(name: newValue, size: self.font.pointSize)
            }
        }
    }
}

тогда для ваших прокси UIAppearance:

UILabel.appearance().substituteFontName = applicationFont
UILabel.appearance().substituteFontNameBold = applicationFontBold

Примечание: если вы обнаруживаете, что жирная подстановка не работает, возможно, имя шрифта по умолчанию не содержит "средний". Выключите эту строку для другого матча по мере необходимости (благодаря Мейсону в комментариях ниже) .

разработка из ответа Hugues BR, но с использованием метода swizzling я пришел к решению, которое успешно изменяет все шрифты на нужный шрифт в моем приложении.

подход с динамическим типом должен быть тем, что вы должны искать на iOS 7. Следующее решение не использует динамический тип.


Примечания:

  • приведенный ниже код в представленном состоянии никогда не был представлен Apple одобрение;
  • есть более короткая версия, которая прошла представление Apple, то есть без - initWithCoder: переопределить. Однако это не будет охватывать все случаи;
  • следующий код присутствует в классе, который я использую для установки стиля моего приложения, который включен моим классом AppDelegate, таким образом, доступен везде и для всех экземпляров UIFont;
  • я использую Zapfino здесь только для того, чтобы сделать изменения гораздо более заметными;
  • любое улучшение вы можете найти к этому коду добро пожаловать.

это решение использует два различных метода для достижения конечного результата. Первый-переопределить методы класса UIFont + systemFontWithSize: и аналогично с теми, которые используют мои альтернативы (здесь я использую "Zapfino", чтобы не оставлять сомнений в том, что замена была успешной).

другой метод-переопределить - initWithCoder: метод на UIFont для замены любого вхождения CTFontRegularUsage и похожие на мои варианты. Этот последний метод был необходим потому что я нашел это UILabel объекты, закодированные в файлах NIB, не проверяют + systemFontWithSize: методы, чтобы получить их системный шрифт и вместо того, чтобы кодировать их как UICTFontDescriptor объекты. Я пытался переопределить - awakeAfterUsingCoder: но каким-то образом он вызывался для каждого закодированного объекта в моей раскадровке и вызывал сбои. Переопределение - awakeFromNib не позволял мне читать

завершить ответ Сэнди Чепмена, вот решение в Objective-C (положите это категория везде, где вы хотите изменить UILabelAppearance):

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

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

@interface UILabel (FontOverride)
  - (void)setSubstituteFontName:(NSString *)name UI_APPEARANCE_SELECTOR;
@end

затем, вы можете изменить Appearance С:

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

я опубликовал его как новый ответ, а не как комментарий, потому что у меня недостаточно репутации.

КОММЕНТАРИЙ ДЛЯ SWIFT 3.0 И SWIFT WARNING

Вы можете удалить предупреждающее сообщение в строке:

let initCoderMethod = class_getInstanceMethod(self, Selector("initWithCoder:"))

, заменив его на:

let initCoderMethod = class_getInstanceMethod(self, #selector(UIFontDescriptor.init(coder:)))

Для Swift 4

все вышеперечисленные ответы верны, но я сделал по-другому, что составляет согласно размеру устройства. Здесь, в классе ATFontManager, я сделал размер шрифта по умолчанию, который определяется в верхней части класса, как defaultFontSize, это размер шрифта iphone plus и вы можете изменить согласно вашему требованию.

     class ATFontManager: UIFont{

    class func setFont( _ iPhone7PlusFontSize: CGFloat? = nil,andFontName fontN : String = FontName.HelveticaNeue) -> UIFont{

        let defaultFontSize : CGFloat = 16

        switch ATDeviceDetector().screenType {

        case .iPhone4:
            if let fontSize = iPhone7PlusFontSize{
                return UIFont(name: fontN, size: fontSize - 3)!
            }
            return UIFont(name: fontN, size: defaultFontSize - 6)!

        case .iPhone5:
            if let fontSize = iPhone7PlusFontSize{
                return UIFont(name: fontN, size: fontSize - 2)!
            }
            return UIFont(name: fontN, size: defaultFontSize - 3)!

        case .iPhone6AndIphone7:
            if let fontSize = iPhone7PlusFontSize{
                return UIFont(name: fontN, size: fontSize - 1)!
            }
            return UIFont(name: fontN, size: defaultFontSize - 1)!

        case .iPhone6PAndIPhone7P:

            return UIFont(name: fontN, size: iPhone7PlusFontSize ?? defaultFontSize)!
        case .iPhoneX:

            return UIFont(name: fontN, size: iPhone7PlusFontSize ?? defaultFontSize)!

        case .iPhoneOrIPadSmallSizeUnknown:

            return UIFont(name: fontN, size: iPhone7PlusFontSize ?? defaultFontSize)!

        case .iPadMini:
            if let fontSize = iPhone7PlusFontSize{
                return UIFont(name: fontN, size: fontSize + 4)!
            }
            return UIFont(name: fontN, size: defaultFontSize + 4)!

        case .iPadPro10Inch:
            if let fontSize = iPhone7PlusFontSize{
                return UIFont(name: fontN, size: fontSize + 5)!
            }
            return UIFont(name: fontN, size: defaultFontSize + 5)!

        case .iPadPro:
            if let fontSize = iPhone7PlusFontSize{
                return UIFont(name: fontN, size: fontSize + 6)!
            }
            return UIFont(name: fontN, size: defaultFontSize + 6)!

        case .iPadUnknown:

            return UIFont(name: fontN, size: defaultFontSize + 3)!

        default:

            return UIFont(name: fontN, size: iPhone7PlusFontSize ?? 15)!
        }
    }
}

Я добавил определенное имя шрифта, для еще вы можете добавить имя шрифта и его тип.

   enum FontName : String {
        case HelveticaNeue = "HelveticaNeue"
        case HelveticaNeueUltraLight = "HelveticaNeue-UltraLight"
        case HelveticaNeueBold = "HelveticaNeue-Bold"
        case HelveticaNeueBoldItalic = "HelveticaNeue-BoldItalic"
        case HelveticaNeueMedium = "HelveticaNeue-Medium"
        case AvenirBlack = "Avenir-Black"
        case ArialBoldMT = "Arial-BoldMT"
        case HoeflerTextBlack = "HoeflerText-Black"
        case AMCAPEternal = "AMCAPEternal"
    }

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

class ATDeviceDetector {

    var iPhone: Bool {

        return UIDevice().userInterfaceIdiom == .phone
    }

    var ipad : Bool{

        return UIDevice().userInterfaceIdiom == .pad
    }

    let isRetina = UIScreen.main.scale >= 2.0


    enum ScreenType: String {

        case iPhone4
        case iPhone5
        case iPhone6AndIphone7
        case iPhone6PAndIPhone7P
        case iPhoneX

        case iPadMini
        case iPadPro
        case iPadPro10Inch

        case iPhoneOrIPadSmallSizeUnknown
        case iPadUnknown
        case unknown
    }


    struct ScreenSize{

        static let SCREEN_WIDTH         = UIScreen.main.bounds.size.width
        static let SCREEN_HEIGHT        = UIScreen.main.bounds.size.height
        static let SCREEN_MAX_LENGTH    = max(ScreenSize.SCREEN_WIDTH,ScreenSize.SCREEN_HEIGHT)
        static let SCREEN_MIN_LENGTH    = min(ScreenSize.SCREEN_WIDTH,ScreenSize.SCREEN_HEIGHT)
    }


    var screenType: ScreenType {

        switch ScreenSize.SCREEN_MAX_LENGTH {

        case 0..<568.0:
            return .iPhone4
        case 568.0:
            return .iPhone5
        case 667.0:
            return .iPhone6AndIphone7
        case 736.0:
            return .iPhone6PAndIPhone7P
        case 812.0:
            return .iPhoneX
        case 568.0..<812.0:
            return .iPhoneOrIPadSmallSizeUnknown
        case 1112.0:
            return .iPadPro10Inch
        case 1024.0:
            return .iPadMini
        case 1366.0:
            return .iPadPro
        case 812.0..<1366.0:
            return .iPadUnknown
        default:
            return .unknown
        }
    }
}

как использовать. надеюсь, что это поможет.

//for default 
label.font = ATFontManager.setFont()

//if you want to provide as your demand. Here **iPhone7PlusFontSize** variable is denoted as font size for *iphone 7plus and iphone 6 plus*, and it **ATFontManager** class automatically handle.
label.font = ATFontManager.setFont(iPhone7PlusFontSize: 15, andFontName: FontName.HelveticaNeue.rawValue)

вероятно, нет, у вас, вероятно, будет установлен шрифт на вашем элементе управления самостоятельно, но вы можете упростить процесс, централизовав, где вы получаете типы шрифтов, например, у делегата приложения или у какого-либо другого общего класса есть метод, который возвращает шрифт, и все, что нужно установить шрифт, может вызвать этот метод, что поможет в случае, если вам нужно изменить шрифт, вы измените его в одном месте, а не везде, где вы устанавливаете шрифты...Другой альтернативой может быть сделать подклассы ваших элементов пользовательского интерфейса, которые будут автоматически устанавливать шрифт, но это может быть излишним..

ни одно из этих решений не работает универсально во всем приложении. Одна вещь, которую я нашел, чтобы помочь управлять шрифтами в Xcode, - это открытие раскадровки в качестве исходного кода (управление-нажмите раскадровку в навигаторе файлов > "открыть как" > "источник"), а затем выполните поиск и замену.

тип шрифта всегда устанавливается в коде и nib / раскадровке.

для кода, так же, как сказал Хьюз БР, сделать это в catagory может решить эту проблему.

для nib / storyboard мы можем использовать метод Swizzling awakeFromNib для изменения типа шрифта, поскольку элемент пользовательского интерфейса из nib / storyboard всегда вызывает его перед отображением на экране.

Я полагаю,вы знаете аспекты.это библиотека для программирования AOP, основанная на методе Swizzling. Мы создаем категории для UILabel, UIButton, UITextView для его реализации.

UILabel:

#import "UILabel+OverrideBaseFont.h"
#import "Aspects.h"

@implementation UILabel (OverrideBaseFont)

+ (void)load {
    [[self class]aspect_hookSelector:@selector(awakeFromNib) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> aspectInfo) {
        UILabel* instance = [aspectInfo instance];
        UIFont* font = [UIFont fontWithName:@"HelveticaNeue-light" size:instance.font.pointSize];
        instance.font = font;
    }error:nil];
}

@end

UIButton:

#import "UIButton+OverrideBaseFont.h"
#import "Aspects.h"

@implementation UIButton (OverrideBaseFont)

+ (void)load {
    [[self class]aspect_hookSelector:@selector(awakeFromNib) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> aspectInfo) {
        UIButton* instance = [aspectInfo instance];
        UILabel* label = instance.titleLabel;
        UIFont* font = [UIFont fontWithName:@"HelveticaNeue-light" size:label.font.pointSize];
        instance.titleLabel.font = font;
    }error:nil];
}

@end

UITextField:

#import "UITextField+OverrideBaseFont.h"
#import "Aspects.h"

@implementation UITextField (OverrideBaseFont)

+ (void)load {
    [[self class]aspect_hookSelector:@selector(awakeFromNib) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> aspectInfo) {
        UITextField* instance = [aspectInfo instance];
        UIFont* font = [UIFont fontWithName:@"HelveticaNeue-light" size:instance.font.pointSize];
        instance.font = font;
    }error:nil];
}

@end

UITextView:

#import "UITextView+OverrideBaseFont.h"
#import "Aspects.h"

@implementation UITextView (OverrideBaseFont)

+ (void)load {
    [[self class]aspect_hookSelector:@selector(awakeFromNib) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> aspectInfo) {
        UITextView* instance = [aspectInfo instance];
        UIFont* font = [UIFont fontWithName:@"HelveticaNeue-light" size:instance.font.pointSize];
        instance.font = font;
    }error:nil];
}

@end

вот и все, вы можете изменить HelveticaNeue-light на макрос с вашим именем шрифта.

Нуи является альтернативой прокси UIAppearance. Это дает вам контроль над шрифтом (и многими другими атрибутами) большого количества типов элементов пользовательского интерфейса в вашем приложении, просто изменяя таблицу стилей, которую можно повторно использовать в нескольких приложениях.

после добавления NUILabel класс для ваших меток, вы можете легко управлять их шрифтом в таблице стилей:

LabelFontName    String    Helvetica

Если у вас есть метки с разными размерами шрифта, вы можете контролировать их размеры с использованием классов Nui Label, LargeLabel и SmallLabel, или даже быстро создавать свои собственные классы.

мы достигли того же в Swift-Xcode 7.2, используя контроллер родительского вида и контроллер дочернего вида (наследование).

File-New-Cocoa Touch class-ParentViewController.

    import UIKit
    import Foundation

    class ParentViewController: UIViewController {

        var appUIColor:UIColor = UIColor.redColor()
        var appFont:UIFont = UIFont(name: "Copperplate", size: 20)!

        override func viewDidLoad() {
            super.viewDidLoad()
        }
        func addStatusBar()
        {
            let view = UIView(frame:
                CGRect(x: 0.0, y: 0.0, width: UIScreen.mainScreen().bounds.size.width, height: 20.0)
            )
            view.backgroundColor = appUIColor
            self.view.addSubview(view)
        }
    }    

сделать дочерние контроллеры представления и связать с раскадровкой VC, добавить textLabel.

    import UIKit

    class FontTestController: ParentViewController {
        @IBOutlet var testLabel: UILabel!

        override func viewDidLoad() {
            super.viewDidLoad()
            testLabel.font =  appFont
            testLabel.textColor = appUIColor
        }

или сделать пользовательский класс UILabel (метод подкласса) и связать с ним необходимые метки.

import Foundation
import UIKit

class CustomFontLabel: UILabel {
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        backgroundColor = ParentViewController().appUIColor
        font = ParentViewController().appFont
        textColor = UIColor.blackColor()
    }
}

Примечание: шрифт и цвет, объявленные в Родительском VC реализованы в CustomFontLabel . Преимущество заключается в том, что мы можем изменить свойства uilabel/any view все вместе в некоторых простых изменениях в Родительском VC.

2)' for ' looping UIView для sub views. Он работает только на конкретном ВК.

    override func viewWillLayoutSubviews() {
            for view in self.view.subviews  {
                if view.isKindOfClass(UITextField) {
                UITextField.appearance().font =  UIFont(name: "Copperplate", size: 20)
                }
                if view.isKindOfClass(UILabel) {
                    UILabel.appearance().font =  UIFont(name: "Copperplate", size: 20)    
                }               
            }       
        }

Я использую как этот тип класса шрифта в swift. Использование класса расширения шрифта.

enum FontName: String {

  case regular      = "Roboto-Regular"

}

//MARK: - Set Font Size
enum FontSize: CGFloat {
    case size = 10

}
extension UIFont {

    //MARK: - Bold Font
  class var regularFont10: UIFont {
        return UIFont(name: FontName.regular.rawValue, size:FontSize.size.rawValue )!
    }
}

Для Xamarin.iOS внутри AppDelegate в FinishedLaunching() ставим такой код :-

UILabel.Appearance.Font= UIFont.FromName("Lato-Regular", 14);

установить шрифт для всего приложения и добавить ' по информации.plist файл , путь должен быть путь, где файл шрифта .ТТФ расположен .Для меня это было внутри папки "шрифты" в моем проекте.

<key>UIAppFonts</key>
    <array>
        <string>fonts/Lato-Regular.ttf</string>
    </array>

Я создал свое собственное преобразование типографии для Swift 4 после просмотра нескольких сообщений, он охватывает большинство случаев, таких как:

struct Resources {

    struct Fonts {
        //struct is extended in Fonts
    }
}

extension Resources.Fonts {

    enum Weight: String {
        case light = "Typo-Light"
        case regular = "Typo-Regular"
        case semibold = "Typo-Semibold"
        case italic = "Typo-LightItalic"
    }
}

extension UIFontDescriptor.AttributeName {
    static let nsctFontUIUsage = UIFontDescriptor.AttributeName(rawValue: "NSCTFontUIUsageAttribute")
}

extension UIFont {

    @objc class func mySystemFont(ofSize: CGFloat, weight: UIFont.Weight) -> UIFont {
        switch weight {
        case .semibold, .bold, .heavy, .black:
            return UIFont(name: Resources.Fonts.Weight.semibold.rawValue, size: ofSize)!

        case .medium, .regular:
            return UIFont(name: Resources.Fonts.Weight.regular.rawValue, size: ofSize)!

        default:
            return UIFont(name: Resources.Fonts.Weight.light.rawValue, size: ofSize)!
        }
    }

    @objc class func mySystemFont(ofSize size: CGFloat) -> UIFont {
        return UIFont(name: Resources.Fonts.Weight.light.rawValue, size: size)!
    }

    @objc class func myBoldSystemFont(ofSize size: CGFloat) -> UIFont {
        return UIFont(name: Resources.Fonts.Weight.semibold.rawValue, size: size)!
    }

    @objc class func myItalicSystemFont(ofSize size: CGFloat) -> UIFont {
        return UIFont(name: Resources.Fonts.Weight.italic.rawValue, size: size)!
    }

    @objc convenience init(myCoder aDecoder: NSCoder) {
        guard
            let fontDescriptor = aDecoder.decodeObject(forKey: "UIFontDescriptor") as? UIFontDescriptor,
            let fontAttribute = fontDescriptor.fontAttributes[.nsctFontUIUsage] as? String else {
                self.init(myCoder: aDecoder)
                return
        }
        var fontName = ""
        switch fontAttribute {
        case "CTFontRegularUsage", "CTFontMediumUsage":
            fontName = Resources.Fonts.Weight.regular.rawValue
        case "CTFontEmphasizedUsage", "CTFontBoldUsage", "CTFontSemiboldUsage","CTFontHeavyUsage", "CTFontBlackUsage":
            fontName = Resources.Fonts.Weight.semibold.rawValue
        case "CTFontObliqueUsage":
            fontName = Resources.Fonts.Weight.italic.rawValue
        default:
            fontName = Resources.Fonts.Weight.light.rawValue
        }
        self.init(name: fontName, size: fontDescriptor.pointSize)!
    }

    class func overrideDefaultTypography() {
        guard self == UIFont.self else { return }

        if let systemFontMethodWithWeight = class_getClassMethod(self, #selector(systemFont(ofSize: weight:))),
            let mySystemFontMethodWithWeight = class_getClassMethod(self, #selector(mySystemFont(ofSize: weight:))) {
            method_exchangeImplementations(systemFontMethodWithWeight, mySystemFontMethodWithWeight)
        }

        if let systemFontMethod = class_getClassMethod(self, #selector(systemFont(ofSize:))),
            let mySystemFontMethod = class_getClassMethod(self, #selector(mySystemFont(ofSize:))) {
            method_exchangeImplementations(systemFontMethod, mySystemFontMethod)
        }

        if let boldSystemFontMethod = class_getClassMethod(self, #selector(boldSystemFont(ofSize:))),
            let myBoldSystemFontMethod = class_getClassMethod(self, #selector(myBoldSystemFont(ofSize:))) {
            method_exchangeImplementations(boldSystemFontMethod, myBoldSystemFontMethod)
        }

        if let italicSystemFontMethod = class_getClassMethod(self, #selector(italicSystemFont(ofSize:))),
            let myItalicSystemFontMethod = class_getClassMethod(self, #selector(myItalicSystemFont(ofSize:))) {
            method_exchangeImplementations(italicSystemFontMethod, myItalicSystemFontMethod)
        }

        if let initCoderMethod = class_getInstanceMethod(self, #selector(UIFontDescriptor.init(coder:))),
            let myInitCoderMethod = class_getInstanceMethod(self, #selector(UIFont.init(myCoder:))) {
            method_exchangeImplementations(initCoderMethod, myInitCoderMethod)
        }
    }
}

наконец вызовите созданный метод в Appdelegate следующий:

class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {

        UIFont.overrideDefaultTypography()
        return true
    }
}

Comments

    Ничего не найдено.