Skip to content

Instantly share code, notes, and snippets.

@howlingblast
Forked from feighter09/Fonts.swift
Created July 11, 2017 14:23
Show Gist options
  • Save howlingblast/4b02ab58cf434c4a6d3cf2f29bda7cca to your computer and use it in GitHub Desktop.
Save howlingblast/4b02ab58cf434c4a6d3cf2f29bda7cca to your computer and use it in GitHub Desktop.
Set global font for iOS app in one place
// MARK: - Swizzling
extension UIFont {
class var defaultFontFamily: String { return "Georgia" }
override public class func initialize()
{
if self == UIFont.self {
swizzleSystemFont()
}
}
private class func swizzleSystemFont()
{
let systemPreferredFontMethod = class_getClassMethod(self, "preferredFontForTextStyle:")
let mySystemPreferredFontMethod = class_getClassMethod(self, "myPreferredFontForTextStyle:")
method_exchangeImplementations(systemPreferredFontMethod, mySystemPreferredFontMethod)
let systemFontMethod = class_getClassMethod(self, "systemFontOfSize:")
let mySystemFontMethod = class_getClassMethod(self, "mySystemFontOfSize:")
method_exchangeImplementations(systemFontMethod, mySystemFontMethod)
let boldSystemFontMethod = class_getClassMethod(self, "boldSystemFontOfSize:")
let myBoldSystemFontMethod = class_getClassMethod(self, "myBoldSystemFontOfSize:")
method_exchangeImplementations(boldSystemFontMethod, myBoldSystemFontMethod)
let italicSystemFontMethod = class_getClassMethod(self, "italicSystemFontOfSize:")
let myItalicSystemFontMethod = class_getClassMethod(self, "myItalicSystemFontOfSize:")
method_exchangeImplementations(italicSystemFontMethod, myItalicSystemFontMethod)
}
}
// MARK: - New Font Methods
extension UIFont {
private class func myPreferredFontForTextStyle(style: String) -> UIFont
{
let defaultFont = myPreferredFontForTextStyle(style) // will not cause stack overflow - this is now the old, default UIFont.preferredFontForTextStyle
let newDescriptor = defaultFont.fontDescriptor().fontDescriptorWithFamily(defaultFontFamily)
return UIFont(descriptor: newDescriptor, size: defaultFont.pointSize)
}
private class func mySystemFontOfSize(fontSize: CGFloat) -> UIFont
{
return myDefaultFontOfSize(fontSize)
}
private class func myBoldSystemFontOfSize(fontSize: CGFloat) -> UIFont
{
return myDefaultFontOfSize(fontSize, withTraits: .TraitBold)
}
private class func myItalicSystemFontOfSize(fontSize: CGFloat) -> UIFont
{
return myDefaultFontOfSize(fontSize, withTraits: .TraitItalic)
}
private class func myDefaultFontOfSize(fontSize: CGFloat, withTraits traits: UIFontDescriptorSymbolicTraits = []) -> UIFont
{
let descriptor = UIFontDescriptor(name: defaultFontFamily, size: fontSize).fontDescriptorWithSymbolicTraits(traits)
return UIFont(descriptor: descriptor, size: fontSize)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment