Ответ 1
Вы можете установить внешний вид UILabel и других UIViews:
UILabel.appearance().font = UIFont(name: "yourFont", size: yourSize)
Больше:
AnyUIView.appearance().font = UIFont(name: "yourFont", size: yourSize)
Я знаю, что для установки пользовательского шрифта элемента на экране я могу просто сделать someLabel.font=UIFont(name: "Exo 2.0", size: 15)
.
Мне было интересно, как можно установить его для всего приложения с помощью быстрой. (Взломам было бы делать то, что я знаю для каждого элемента приложения, но это будет просто кошмар для новинок)
Я вижу, что этот вопрос уже задан с тегом objective-C, Как установить пользовательский шрифт для всего приложения iOS без указания размера, но я недостаточно знакомы с objective-C достаточно, чтобы переносить код в swift
Вы можете установить внешний вид UILabel и других UIViews:
UILabel.appearance().font = UIFont(name: "yourFont", size: yourSize)
Больше:
AnyUIView.appearance().font = UIFont(name: "yourFont", size: yourSize)
В качестве более подробного ответа и с этими преимуществами я рекомендую использовать расширения:
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
НАКОНЕЦ понял это. Самый чистый способ, который я мог найти. (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"))
Я нашел способ сделать то же самое в Swift 4 с iOS 11
Нужно только добавить ключевое слово @objc
до имени переменной.
Таким образом, объявление переменной будет таким:
@objc public var substituteFontName : String {
get {}
set {}
}
Надеюсь, это поможет другим, кто сталкивается с этой проблемой.