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

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

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

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

я хочу что-то вроде

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

Это возможно? Кто-нибудь может мне с этим помочь?


person Jay Pandya    schedule 23.10.2013    source источник
comment
Был `[[Внешний вид UILabel] setFont:[UIFont fontWithName:@YourFontName size:17.0]];`, который теперь устарел. Взгляните на ссылку StuartM - это хороший ответ.   -  person brainray    schedule 23.10.2013


Ответы (1)


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

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

Однако вот что делать:

  1. Создайте категорию UIFont, например UIFont+CustomSystemFont.
  2. Импортируйте <objc/runtime.h> в свой файл .m.
  3. Оставьте файл .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];
}

// Перебор метода

+(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);
}
person matteodv    schedule 23.10.2013
comment
Эй, Маттеодв!! Это отличная работа 100+ с моей стороны. Вы же много работы и времени для меня ..... - person Jay Pandya; 24.10.2013
comment
Это соответствует рекомендациям Apple? Мне бы точно помогло... - person Fábio Oliveira; 11.11.2013
comment
Да, это разрешено рекомендациями Apple, так как я обновил свое приложение для iOS 7, используя этот метод, и у меня не было проблем! - person matteodv; 11.11.2013
comment
Как ни странно, это не работает для всех моих представлений: например, шрифт, используемый в заполнителях UITextView, по-прежнему является исходным системным шрифтом. У вас есть решение для этого? - person Redwarp; 19.02.2014
comment
^ то же самое для меня любое исправление @Redwarp - person jamespick; 08.07.2014