Динамическое изменение семейства шрифтов в приложении - PullRequest
0 голосов
/ 16 октября 2018

Я работаю над одним многоцелевым проектом, в котором он состоит из двух приложений, каждое из которых имеет собственный бренд.

Я различил имя приложения, значок приложения и цвет фирменного стиля приложения, но теперь мне нужно динамически переключать семейство шрифтов приложения после получения сведений о брендинге из API.

Проблема, с которой я столкнулсяпопытка решить - сохранить одинаковый размер шрифта, но с другим семейством шрифтов.

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

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Я нашел способ решить эту проблему с помощью метода Swizzling.Ниже приведены шаги для решения этой проблемы:

  • Шаг 1: создайте расширение UIFont и следующий код для переопределения имени шрифта и среды выполнения семейства.

Пример кода:

  var appFontName = "ArialMT"
  var appFontBoldName = "Arial-BoldMT"

 extension UIFontDescriptor.AttributeName {
   static let nsctFontUIUsage = UIFontDescriptor.AttributeName(rawValue: "NSCTFontUIUsageAttribute")
 } 

extension UIFont {

@objc class func mySystemFont(ofSize size: CGFloat) -> UIFont {
    return UIFont(name: appFontName, size: size)!
}

@objc class func myBoldSystemFont(ofSize size: CGFloat) -> UIFont {
    return UIFont(name: appFontBoldName, size: size)!
}

@objc convenience init(myCoder aDecoder: NSCoder) {

    guard let fontDescriptor = aDecoder.decodeObject(forKey: "UIFontDescriptor") as? UIFontDescriptor else  {
        self.init(myCoder: aDecoder)
        return
    }
    let face = fontDescriptor.object(forKey: UIFontDescriptor.AttributeName.face) as? String ?? "Regular"
    var fontName = appFontName

    switch face {
    case "Regular":
        fontName = appFontName
    case "Bold":
        fontName = appFontBoldName
    default:
        fontName = appFontName
    }
    self.init(name: fontName, size: fontDescriptor.pointSize)!
}

class func overrideInitialize() {
    if self == UIFont.self {
        let systemFontMethod = class_getClassMethod(self, #selector(systemFont(ofSize:)))
        let mySystemFontMethod = class_getClassMethod(self, #selector(mySystemFont(ofSize:)))
        method_exchangeImplementations(systemFontMethod!, mySystemFontMethod!)

        let boldSystemFontMethod = class_getClassMethod(self, #selector(boldSystemFont(ofSize:)))
        let myBoldSystemFontMethod = class_getClassMethod(self, #selector(myBoldSystemFont(ofSize:)))
        method_exchangeImplementations(boldSystemFontMethod!, myBoldSystemFontMethod!)

        let initCoderMethod = class_getInstanceMethod(self, #selector(UIFontDescriptor.init(coder:)))
        let myInitCoderMethod = class_getInstanceMethod(self, #selector(UIFont.init(myCoder:)))
        method_exchangeImplementations(initCoderMethod!, myInitCoderMethod!)
    }
  }
}
  • Шаг 2: (использование) и вызов метода overrideInitialize.

    UIFont.overrideInitialize()
    

Он сохраняет размер шрифта путем изменения семейства шрифтов во всем приложении.,:)

0 голосов
/ 16 октября 2018

Обновите внешний вид всего приложения за считанные минуты, используя NUI .Вам просто нужно определить темы, такие как Theme1.nss и Theme2.nss в двух разных файлах, а затем метод AppDelegate application didFinishLaunchingWithOptions, вы просто указываете инфраструктуре NUI загружать эти темы в соответствии с целями

, если Target1

[NUISettings initWithStylesheet:@"Theme1"];    

# elif Target2

[NUISettings initWithStylesheet:@"Theme2"];

# endif

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...