@@ -1,61 +1,89 @@
public protocol SwizzlingInjection : class {
static func inject( )
}
class SwizzlingHelper {
private static let doOnce : Any ? = {
UIFont . inject ( )
return nil
} ( )
static func enableInjection( ) {
_ = SwizzlingHelper . doOnce
}
}
extension UIApplication {
override open var next : UIResponder ? {
// Called before applicationDidFinishLaunching
SwizzlingHelper . enableInjection ( )
return super. next
}
}
// 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)
}
extension UIFont : SwizzlingInjection {
class var defaultFontFamily : String { return " Satellite " }
public static func inject( ) {
// make sure this isn't a subclass
guard self === UIFont . self else { return }
// Do your own method_exchangeImplementations(originalMethod, swizzledMethod) here
swizzleSystemFont ( )
}
private class func swizzleSystemFont( )
{
let systemPreferredFontMethod = class_getClassMethod ( self , #selector( UIFont . preferredFont ( forTextStyle: ) ) )
let mySystemPreferredFontMethod = class_getClassMethod ( self , #selector( UIFont . myPreferredFontForTextStyle ( style: ) ) )
method_exchangeImplementations ( systemPreferredFontMethod!, mySystemPreferredFontMethod!)
let systemFontMethod = class_getClassMethod ( self , #selector( UIFont . systemFont ( ofSize: ) ) )
let mySystemFontMethod = class_getClassMethod ( self , #selector( UIFont . mySystemFont ( ofSize: ) ) )
method_exchangeImplementations ( systemFontMethod!, mySystemFontMethod!)
let boldSystemFontMethod = class_getClassMethod ( self , #selector( UIFont . boldSystemFont ( ofSize: ) ) )
let myBoldSystemFontMethod = class_getClassMethod ( self , #selector( UIFont . myBoldSystemFont ( ofSize: ) ) )
method_exchangeImplementations ( boldSystemFontMethod!, myBoldSystemFontMethod!)
let italicSystemFontMethod = class_getClassMethod ( self , #selector( UIFont . italicSystemFont ( ofSize: ) ) )
let myItalicSystemFontMethod = class_getClassMethod ( self , #selector( UIFont . myItalicSystemFont ( ofSize: ) ) )
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 )
}
}
@ objc private class func myPreferredFontForTextStyle( style: String ) -> UIFont
{
let defaultFont = myPreferredFontForTextStyle ( style : style) // will not cause stack overflow - this is now the old, default UIFont.preferredFontForTextStyle
let newDescriptor = defaultFont. fontDescriptor. withFamily ( defaultFontFamily)
return UIFont ( descriptor: newDescriptor, size: defaultFont. pointSize)
}
@ objc private class func mySystemFont ( ofSize : CGFloat ) -> UIFont
{
return myDefaultFont ( ofSize : ofSize )
}
@ objc private class func myBoldSystemFont ( ofSize : CGFloat ) -> UIFont
{
return myDefaultFont ( ofSize : ofSize , withTraits: . traitBold )
}
@ objc private class func myItalicSystemFont ( ofSize : CGFloat ) -> UIFont
{
return myDefaultFont ( ofSize : ofSize , withTraits: . traitItalic )
}
private class func myDefaultFont ( ofSize : CGFloat , withTraits traits: UIFontDescriptorSymbolicTraits = [ ] ) -> UIFont
{
let descriptor = UIFontDescriptor ( name: defaultFontFamily, size: ofSize ) . withSymbolicTraits ( traits)
return UIFont ( descriptor: descriptor! , size: ofSize )
}
}