Как использовать метод swizzling для изменения системного шрифта, используемого в приложении iOS? - PullRequest
1 голос
/ 30 января 2020

Я создаю приложение iOS, в котором разные шрифты должны использоваться для разных языков.

Я пытаюсь сделать это, используя systemFont везде в приложении и во время выполнения, меняя то, что systemFont относится к зависимости от языка.

Ниже приведен код, используемый для переключения методов класса UIFont -

extension UIFont {
    static let setSystemFont: Void = {
        let m1 = class_getClassMethod(UIFont.self, #selector(systemFont(ofSize:)))!
        let m2 = class_getClassMethod(UIFont.self, #selector(customFont(ofSize:)))!
        method_exchangeImplementations(m1, m2)

        let m3 = class_getClassMethod(UIFont.self, #selector(preferredFont(forTextStyle:)))!
        let m4 = class_getClassMethod(UIFont.self, #selector(customFont(forTextStyle:)))!
        method_exchangeImplementations(m3, m4)

        let m5 = class_getClassMethod(UIFont.self, #selector(boldSystemFont(ofSize:)))!
        let m6 = class_getClassMethod(UIFont.self, #selector(boldCustomFont(ofSize:)))!
        method_exchangeImplementations(m5, m6)

        let m7 = class_getClassMethod(UIFont.self, #selector(italicSystemFont(ofSize:)))!
        let m8 = class_getClassMethod(UIFont.self, #selector(italicCustomFont(ofSize:)))!
        method_exchangeImplementations(m7, m8)

        let m9 = class_getClassMethod(UIFont.self, #selector(systemFont(ofSize:weight:)))!
        let m10 = class_getClassMethod(UIFont.self, #selector(customFont(ofSize:weight:)))!
        method_exchangeImplementations(m9, m10)

        let m11 = class_getClassMethod(UIFont.self, #selector(preferredFont(forTextStyle:compatibleWith:)))!
        let m12 = class_getClassMethod(UIFont.self, #selector(customFont(forTextStyle:compatibleWith:)))!
        method_exchangeImplementations(m11, m12)
    }()
}

private extension UIFont {
    @objc
    class func customFont(ofSize fontSize: CGFloat) -> UIFont {
        UIFont(name: "Chalkduster", size: fontSize)!
    }
    @objc
    class func customFont(forTextStyle style: UIFont.TextStyle) -> UIFont {
        UIFont(name: "Chalkduster", size: 15)!
    }
    @objc
    class func boldCustomFont(ofSize fontSize: CGFloat) -> UIFont {
        UIFont(name: "Chalkduster", size: fontSize)!
    }
    @objc
    class func italicCustomFont(ofSize fontSize: CGFloat) -> UIFont {
        UIFont(name: "Chalkduster", size: fontSize)!
    }
    @objc
    class func customFont(ofSize fontSize: CGFloat, weight: UIFont.Weight) -> UIFont {
        UIFont(name: "Chalkduster", size: fontSize)!
    }
    @objc
    class func customFont(forTextStyle style: UIFont.TextStyle, compatibleWith traitCollection: UITraitCollection) -> UIFont {
        UIFont(name: "Chalkduster", size: 15)!
    }
}

Примечание- Chalkduster используется для изменения шрифта Легко наблюдать.

В applicationDidFinishLaunching(_:) следующий код называется

UIFont.setSystemFont

Когда приложение запускается, я наблюдаю, что для любых программно созданных представлений systemFont изменяется и используется шрифт Chalkduster.

Однако для любых представлений, созданных из файлов xib, системный шрифт не изменяется.

Может кто-нибудь указать, как изменить системный шрифт, используемый в XIB-файлы без изменения шрифта в XIB-файле?

...