// 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) } }