Définir une police par défaut pour l'ensemble de l'application iOS?
j'ai une police personnalisée que je veux utiliser pour tout ce qui affiche du texte dans mon application, des étiquettes, des vues de texte, etc.
Est-il un moyen de définir la police par défaut (étiquettes par défaut, utilisez SystemFont) pour l'ensemble de l'application?
16 réponses
cela semble possible dans iOS 5 en utilisant le proxy UIAppearance.
[[UILabel appearance] setFont:[UIFont fontWithName:@"YourFontName" size:17.0]];
qui définira la police à utiliser quelle que soit votre police personnalisée pour tous les UILabels de votre application. Vous devrez le répéter pour chaque contrôle (UIButton, UILabel, etc.).
rappelez-vous que vous aurez besoin de mettre la valeur UIAppFonts dans vos informations.insérez et incluez le nom de la police que vous incluez.
il y a aussi une autre solution qui sera d'outrepasser systemFont.
créez juste une catégorie
UIFont+SystemFontOverride.h
#import <UIKit/UIKit.h>
@interface UIFont (SystemFontOverride)
@end
UIFont+SystemFontOverride.m
@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
cela remplacera l'implémentation par défaut et la plupart des UIControls utilisent systemFont.
Swift 4.1
Base sur la réponse de Fábio Oliveira ( https://stackoverflow.com/a/23042694/2082851 ), je fais mon propre swift 4.
en bref, cette extension échange des fonctions par défaut init(coder:)
, systemFont(ofSize:)
, boldSystemFont(ofSize:)
, italicSystemFont(ofSize:)
avec mes méthodes personnalisées.
notez que ce n'est pas entièrement implémenté, mais vous pouvez échanger plus de méthodes basées sur mon implémentation.
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()
}
...
}
si vous utilisez Swift, vous pouvez créer une extension UILabel:
extension UILabel {
var substituteFontName : String {
get { return self.font.fontName }
set { self.font = UIFont(name: newValue, size: self.font.pointSize) }
}
}
et ensuite où vous faites votre apparence proxy:
UILabel.appearance().substituteFontName = applicationFont
il y a un code objectif-c équivalent utilisant UI_APPEARANCE_SELECTOR
sur une propriété avec le nom substituteFontName
.
Plus
pour le cas où vous voudriez mettre des polices de caractères gras et régulières séparément:
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)
}
}
}
}
puis pour vos mandataires UIAppearance:
UILabel.appearance().substituteFontName = applicationFont
UILabel.appearance().substituteFontNameBold = applicationFontBold
Note: Si vous constatez que la substitution en gras ne fonctionne pas, il est possible que le nom de police par défaut ne contienne pas "Medium". Interrupteur de la chaîne pour un autre match en tant que de besoin (grâce à Mason dans les commentaires ci-dessous) .
développement à partir de Hugues BR réponse, mais en utilisant la méthode swizzling je suis arrivé à une solution qui est avec succès de changer toutes les polices à une police désirée dans mon application.
une approche de type dynamique devrait être ce que vous devriez chercher sur iOS 7. La solution suivante n'utilise pas le type dynamique.
Notes:
- le code ci-dessous, dans sa présentation
- il y a une version plus courte qui a passé Apple submission, c'est-à-dire sans le
- initWithCoder:
override. Cependant, cela ne couvrira pas tous les cas; - le code suivant est présent dans une classe que j'utilise pour définir le style de mon application qui est inclus dans ma classe AppDelegate étant ainsi disponible partout et à toutes les instances UIFont;
- J'utilise Zapfino ici juste pour faire le changements beaucoup plus visibles;
- toute amélioration que vous trouverez à ce code est la bienvenue.
cette solution utilise deux méthodes différentes pour obtenir le résultat final. La première est d'outrepasser les méthodes de classe UIFont + systemFontWithSize:
et similaire avec ceux qui utilisent mes alternatives (ici, j'utilise" Zapfino " pour ne laisser aucun doute que le remplacement a réussi).
L'autre méthode consiste à substituer - initWithCoder:
méthode sur UIFont pour remplacer toute occurrence de CTFontRegularUsage
et similaire par mes alternatives.
Cette dernière méthode était nécessaire car j'ai trouvé que les objets UILabel
encodés dans les fichiers NIB ne vérifient pas les méthodes + systemFontWithSize:
pour obtenir leur police système et les encodent plutôt comme des objets UICTFontDescriptor
.
J'ai essayé de remplacer - awakeAfterUsingCoder:
mais d'une façon ou d'une autre il a été appelé pour chaque objet encodé dans mon storyboard et causer des accidents. - awakeFromNib
ne me permettrait pas de lisez l'objet NSCoder
.
#import <objc/runtime.h>
NSString *const FORegularFontName = @"Zapfino";
NSString *const FOBoldFontName = @"Zapfino";
NSString *const FOItalicFontName = @"Zapfino";
#pragma mark - UIFont category
@implementation UIFont (CustomFonts)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
+ (void)replaceClassSelector:(SEL)originalSelector withSelector:(SEL)modifiedSelector {
Method originalMethod = class_getClassMethod(self, originalSelector);
Method modifiedMethod = class_getClassMethod(self, modifiedSelector);
method_exchangeImplementations(originalMethod, modifiedMethod);
}
+ (void)replaceInstanceSelector:(SEL)originalSelector withSelector:(SEL)modifiedSelector {
Method originalDecoderMethod = class_getInstanceMethod(self, originalSelector);
Method modifiedDecoderMethod = class_getInstanceMethod(self, modifiedSelector);
method_exchangeImplementations(originalDecoderMethod, modifiedDecoderMethod);
}
+ (UIFont *)regularFontWithSize:(CGFloat)size
{
return [UIFont fontWithName:FORegularFontName size:size];
}
+ (UIFont *)boldFontWithSize:(CGFloat)size
{
return [UIFont fontWithName:FOBoldFontName size:size];
}
+ (UIFont *)italicFontOfSize:(CGFloat)fontSize
{
return [UIFont fontWithName:FOItalicFontName size:fontSize];
}
- (id)initCustomWithCoder:(NSCoder *)aDecoder {
BOOL result = [aDecoder containsValueForKey:@"UIFontDescriptor"];
if (result) {
UIFontDescriptor *descriptor = [aDecoder decodeObjectForKey:@"UIFontDescriptor"];
NSString *fontName;
if ([descriptor.fontAttributes[@"NSCTFontUIUsageAttribute"] isEqualToString:@"CTFontRegularUsage"]) {
fontName = FORegularFontName;
}
else if ([descriptor.fontAttributes[@"NSCTFontUIUsageAttribute"] isEqualToString:@"CTFontEmphasizedUsage"]) {
fontName = FOBoldFontName;
}
else if ([descriptor.fontAttributes[@"NSCTFontUIUsageAttribute"] isEqualToString:@"CTFontObliqueUsage"]) {
fontName = FOItalicFontName;
}
else {
fontName = descriptor.fontAttributes[@"NSFontNameAttribute"];
}
return [UIFont fontWithName:fontName size:descriptor.pointSize];
}
self = [self initCustomWithCoder:aDecoder];
return self;
}
+ (void)load
{
[self replaceClassSelector:@selector(systemFontOfSize:) withSelector:@selector(regularFontWithSize:)];
[self replaceClassSelector:@selector(boldSystemFontOfSize:) withSelector:@selector(boldFontWithSize:)];
[self replaceClassSelector:@selector(italicSystemFontOfSize:) withSelector:@selector(italicFontOfSize:)];
[self replaceInstanceSelector:@selector(initWithCoder:) withSelector:@selector(initCustomWithCoder:)];
}
#pragma clang diagnostic pop
@end
pour compléter réponse de Sandy Chapman , voici une solution dans L'objectif-C (mettre cette catégorie n'importe où vous voulez changer UILabel
Appearance
):
@implementation UILabel (SubstituteFontName)
- (void)setSubstituteFontName:(NSString *)name UI_APPEARANCE_SELECTOR {
self.font = [UIFont fontWithName:name size:self.font.pointSize];
}
@end
le fichier d'interface, devrait avoir cette méthode publiquement déclaré à être utilisé plus tard à partir d'endroits comme votre délégué app:
@interface UILabel (FontOverride)
- (void)setSubstituteFontName:(NSString *)name UI_APPEARANCE_SELECTOR;
@end
alors, vous pouvez changer le Appearance
avec:
[[UILabel appearance] setSubstituteFontName:@"SourceSansPro-Light"];
j'ai publié une nouvelle réponse et non pas comme un commentaire parce que je n'ai pas assez de réputation.
COMMENT FOR SWIFT 3.0 AND SWIFT WARNING
vous pouvez supprimer le message d'avertissement dans la ligne:
let initCoderMethod = class_getInstanceMethod(self, Selector("initWithCoder:"))
en le remplaçant par:
let initCoderMethod = class_getInstanceMethod(self, #selector(UIFontDescriptor.init(coder:)))
Pour Swift 4
toutes les réponses ci-dessus sont correctes, mais je l'ai fait d'une manière peu différente qui est selon la taille de l'appareil . Ici, dans la classe ATFontManager, j'ai fait la taille de police par défaut qui est défini en haut de la classe comme defaultFontSize , c'est la taille de police de plus iphone et vous pouvez changer selon votre exigence.
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)!
}
}
}
j'ai ajouté certains noms de police, pour plus vous pouvez ajouter le nom de police et taper ici.
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"
}
cette classe se rapporte au détecteur de dispositif afin de fournir la taille de police appropriée selon le dispositif.
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
}
}
}
comment utiliser. j'Espère que ça aidera.
//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)
probablement pas, vous aurez probablement l'ensemble de la police sur votre contrôle vous-même, mais vous pouvez rendre le processus plus facile en centralisant où vous obtenez les types de fonte, par exemple avoir l'app delegate ou une autre classe commune ont une méthode qui renvoie la fonte, et tout ce qui a besoin de définir la fonte peut appeler cette méthode, qui aidera dans le cas où vous avez besoin de changer votre fonte, vous le changez à un endroit plutôt que partout où vous définissez les fontes...Une autre solution peut être de faire sous-classes de vos éléments UI qui définiront automatiquement la police, mais qui pourrait être exagérée..
aucune de ces solutions ne fonctionne universellement dans l'application. Une chose que j'ai trouvée pour aider à gérer les polices de caractères dans Xcode est d'ouvrir le Storyboard comme code Source (Control-click storyboard in Files navigator > "Open as" > "Source"), puis de faire une recherche-et-remplacer.
le type de police doit toujours être défini dans le code et le nib / storyboard.
Pour le code,tout comme Hugues BR a dit ,est-il dans la catégorie de résoudre le problème.
pour le nib / storyboard, nous pouvons utiliser la méthode Swizzling awakeFromNib pour changer le type de police puisque L'élément UI de nib/storyboard l'appelle toujours avant de l'afficher à l'écran.
je suppose que vous savez Aspects .C'est une bibliothèque pour AOP. programmation, basée sur la méthode Swizzling. Nous créons catagory pour UILabel,UIButton, UITextView pour l'implémenter.
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
c'est tout,vous pouvez changer HelveticaNeue-light en macro avec votre nom de police.
NUI est une alternative à la UIAppearance proxy. Il vous donne le contrôle sur la police (et de nombreux autres attributs) d'un grand nombre de types D'éléments de L'interface utilisateur tout au long de votre application en modifiant simplement une feuille de style, qui peut être réutilisé à travers de multiples applications.
après avoir ajouté une classe NUILabel
à vos étiquettes, vous pouvez facilement contrôler leur police dans la feuille de style:
LabelFontName String Helvetica
Si vous avez des étiquettes avec différentes tailles de police, vous pouvez contrôler leurs tailles en utilisant les classes de Nui Label, LargeLabel et SmallLabel, ou même créer rapidement vos propres classes.
nous avons obtenu la même chose dans Swift-Xcode 7.2 en utilisant le contrôleur de vue Parent et le contrôleur de vue enfant (héritage).
Fichier - Nouveau - Cocoa Touch classe - 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)
}
}
faire des contrôleurs de vue d'enfant et s'associer avec un StoryBoard VC, ajouter un textLabel.
import UIKit
class FontTestController: ParentViewController {
@IBOutlet var testLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
testLabel.font = appFont
testLabel.textColor = appUIColor
}
ou créer une classe UILabel personnalisée(méthode de sous-classification) et y associer les étiquettes requises.
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()
}
}
Note: la police et la couleur déclarées dans le Parent VC sont implémentées dans CustomFontLabel . L'avantage est que nous pouvons modifier les propriétés de uilabel/n'importe quelle vue tous ensemble dans quelques changements simples de parent VC.
2) "pour" boucle UIView pour les sous-vues. Il ne fonctionne que sur un VC particulier.
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)
}
}
}
utilise comme ce type de classe de police dans swift. Utilisation de la classe font extension.
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 )!
}
}
Pour Xamarin.iOS à l'intérieur de AppDelegate FinishedLaunching()
mettre le code comme ceci :-
UILabel.Appearance.Font= UIFont.FromName("Lato-Regular", 14);
définir police pour l'ensemble de l'application et Ajouter" UIAppFonts
" clé sur Info.plist , le chemin doit être le chemin où le fichier de police .ttf est situé .Pour moi, c'était dans le dossier "fonts" de mon projet.
<key>UIAppFonts</key>
<array>
<string>fonts/Lato-Regular.ttf</string>
</array>
j'ai créé ma propre conversion de typographie pour Swift 4 après avoir examiné quelques messages, il couvre la plupart des cas, tels que:
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)
}
}
}
enfin appel à la méthode créée à Appdelegate
comme suivant:
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
UIFont.overrideDefaultTypography()
return true
}
}