Использование пользовательского шрифта для всего приложения iOS быстро

Я знаю, что для установки пользовательского шрифта элемента на экране я могу просто сделать someLabel.font=UIFont(name: "Exo 2.0", size: 15).

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

Я вижу, что этот вопрос уже задан с тегом objective-C, Как установить пользовательский шрифт для всего приложения iOS без указания размера, но я недостаточно знакомы с objective-C достаточно, чтобы переносить код в swift

Ответы

Ответ 1

Вы можете установить внешний вид UILabel и других UIViews:

UILabel.appearance().font = UIFont(name: "yourFont", size: yourSize)

Больше:

AnyUIView.appearance().font = UIFont(name: "yourFont", size: yourSize)

Ответ 2

В качестве более подробного ответа и с этими преимуществами я рекомендую использовать расширения:

  • Нет переопределения размера (все, что вы установили в конструкторе, будет использоваться)
  • В моем коде не реализовано переопределение стиля (Bold, Light, Medium, UltraLight, но вы можете настроить его по мере необходимости)
import UIKit

extension UILabel {
    public var substituteFontName : String {
        get {
            return self.font.fontName;
        }
        set {
            let fontNameToTest = self.font.fontName.lowercased();
            var fontName = newValue;
            if fontNameToTest.range(of: "bold") != nil {
                fontName += "-Bold";
            } else if fontNameToTest.range(of: "medium") != nil {
                fontName += "-Medium";
            } else if fontNameToTest.range(of: "light") != nil {
                fontName += "-Light";
            } else if fontNameToTest.range(of: "ultralight") != nil {
                fontName += "-UltraLight";
            }
            self.font = UIFont(name: fontName, size: self.font.pointSize)
        }
    }
}

extension UITextView {
    public var substituteFontName : String {
        get {
            return self.font?.fontName ?? "";
        }
        set {
            let fontNameToTest = self.font?.fontName.lowercased() ?? "";
            var fontName = newValue;
            if fontNameToTest.range(of: "bold") != nil {
                fontName += "-Bold";
            } else if fontNameToTest.range(of: "medium") != nil {
                fontName += "-Medium";
            } else if fontNameToTest.range(of: "light") != nil {
                fontName += "-Light";
            } else if fontNameToTest.range(of: "ultralight") != nil {
                fontName += "-UltraLight";
            }
            self.font = UIFont(name: fontName, size: self.font?.pointSize ?? 17)
        }
    }
}

extension UITextField {
    public var substituteFontName : String {
        get {
            return self.font?.fontName ?? "";
        }
        set {
            let fontNameToTest = self.font?.fontName.lowercased() ?? "";
            var fontName = newValue;
            if fontNameToTest.range(of: "bold") != nil {
                fontName += "-Bold";
            } else if fontNameToTest.range(of: "medium") != nil {
                fontName += "-Medium";
            } else if fontNameToTest.range(of: "light") != nil {
                fontName += "-Light";
            } else if fontNameToTest.range(of: "ultralight") != nil {
                fontName += "-UltraLight";
            }
            self.font = UIFont(name: fontName, size: self.font?.pointSize ?? 17)
        }
    }
}

Образцы для использования расширений:

например. поместите эти строки в ваш пульт управления viewDidLoad

    UILabel.appearance().substituteFontName = "IRANSans"; // USE YOUR FONT NAME INSTEAD
    UITextView.appearance().substituteFontName = "IRANSans"; // USE YOUR FONT NAME INSTEAD
    UITextField.appearance().substituteFontName = "IRANSans"; // USE YOUR FONT NAME INSTEAD

P.S. как отметил @Christian, вы можете написать свои собственные расширения почти для AnyUIView

Ответ 3

НАКОНЕЦ понял это. Самый чистый способ, который я мог найти. (Swift 4) Решение не требует установки размеров шрифта и не переопределяет все размеры шрифтов.

  UILabel.appearance().font = UIFont.preferredFont(forTextStyle: UIFontTextStyle(rawValue: "Roboto"))

Для тех, кто ищет, где разместить этот код. Я положил его в свой файл AppDelegate.swift внутри

 func application(_ application: UIApplication, 
 didFinishLaunchingWithOptions...

Swift 4.2

 UILabel.appearance().font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle(rawValue: "Roboto"))

Ответ 4

Я нашел способ сделать то же самое в Swift 4 с iOS 11

Нужно только добавить ключевое слово @objc до имени переменной. Таким образом, объявление переменной будет таким:

@objc public var substituteFontName : String {
    get {}
    set {}
}

Надеюсь, это поможет другим, кто сталкивается с этой проблемой.