Как установить собственное семейство шрифтов в качестве системного шрифта в приложении ios

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

  • Загрузите файлы семейства шрифтов с расширением .ttf.
  • Добавьте их в пакет ресурсов.
  • В файле info.plist добавьте ключевые шрифты, предоставленные приложением.

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

Мне нужно что-то вроде

[[UIApplication sharedApplication] systemFont:@"Arial"];

Возможно ли это? Может ли кто-нибудь помочь мне в этом?

Ответ 1

У меня была такая же проблема при обновлении моего приложения iOS для iOS 7. Я хотел установить собственный шрифт для всего приложения, даже для элементов управления вам не разрешено настраивать их шрифт (например, сборщики).
После небольшого исследования в Интернете и в Twitter я решил использовать метод Swizzling, который является практикой, заключающейся в обмене реализациями методов.

ПРИМЕЧАНИЕ. Этот метод может быть опасным, если его использовать не рекомендуется! Прочтите эту дискуссию о SO: Опасности метода Swizzling

Однако это то, что нужно сделать:

  • Создайте категорию UIFont, например UIFont + CustomSystemFont.
  • Импортировать <objc/runtime.h> в ваш .m файл.
  • Оставьте файл .h немодифицированным и добавьте этот код в .m:
+(UIFont *)regularFontWithSize:(CGFloat)size
{
  return [UIFont fontWithName:@"Your Font Name Here" size:size];
}

+(UIFont *)boldFontWithSize:(CGFloat)size
{
  return [UIFont fontWithName:@"Your Bold Font Name Here" size:size];
}

//Метод Swizzling

+(void)load
{
    SEL original = @selector(systemFontOfSize:);
    SEL modified = @selector(regularFontWithSize:);
    SEL originalBold = @selector(boldSystemFontOfSize:);
    SEL modifiedBold = @selector(boldFontWithSize:);

    Method originalMethod = class_getClassMethod(self, original);
    Method modifiedMethod = class_getClassMethod(self, modified);
    method_exchangeImplementations(originalMethod, modifiedMethod);

    Method originalBoldMethod = class_getClassMethod(self, originalBold);
    Method modifiedBoldMethod = class_getClassMethod(self, modifiedBold);
    method_exchangeImplementations(originalBoldMethod, modifiedBoldMethod);
}