Пользовательские шрифты в iOS 7


102

Я разрабатываю игру и хочу использовать собственный шрифт в своем приложении. Я использую для этого SpriteKit, если это важно. Я пробовал использовать этот https://github.com/deni2s/IBCustomFonts, но не могу заставить его работать с этим шрифтом http://www.fontspace.com/freaky-fonts/emulogic

Я пробовал разные вещи и зарегистрировал шрифт в info.plist приложения ... Кто-нибудь знает, что происходит?


Вы уверены, что используете правильное имя для шрифта при использовании его в своем коде?
— Ник

1
этот блог может быть вам полезен codewithchris.com/…
— Xu Yin

Ответы:


277

Прежде всего я предполагаю, что SpriteKit не имеет никакого значения.

  1. Вам нужно скопировать шрифт в формате .otf или .ttf в свой проект. Например, в вспомогательных файлах.
  2. Вам необходимо отредактировать файл .plist . Добавьте ключ «Шрифты, предоставленные приложением» в свой список и в элементе 0 скопируйте точное имя файла шрифта, который вы скопировали в вспомогательные файлы с расширением. Например: «JosefinSansStd-Light_0.otf».
  3. Убедитесь, что шрифт, который вы импортировали в свое приложение, упаковывается в само приложение. Для этого выберите Target , затем Build Phases , затем Copy Bundle Resources . Если вы не видите там свой шрифт, перетащите его из вспомогательных файлов .

Наконец, вы хотите перечислить все свои шрифты, когда приложение запустится, просто чтобы увидеть подходящее имя для вашего шрифта. Вы сделаете это с помощью этого небольшого фрагмента кода:

NSArray *fontFamilies = [UIFont familyNames];
for (int i = 0; i < [fontFamilies count]; i++)
{
    NSString *fontFamily = [fontFamilies objectAtIndex:i];
    NSArray *fontNames = [UIFont fontNamesForFamilyName:[fontFamilies objectAtIndex:i]];
    NSLog (@"%@: %@", fontFamily, fontNames);
}

Найдите свой шрифт в распечатанных результатах, например, я бы поискал «Josefin» и увидел бы, что фактическое имя шрифта - «JosefinSansStd-Light». После этого вам нужно будет использовать только этот шрифт:

UIFont *customFont = [UIFont fontWithName:@"JosefinSansStd-Light" size:20];

В iOS8 вы добавляете свои шрифты прямо в проект, и они видны в построителе интерфейса. Измените свой код, чтобы учесть это, но программно установите шрифт для iOS7 и выберите его в построителе интерфейса xCode6. PS. Конструктор интерфейса в xCode6 дает вам правильное имя шрифта, которое вы можете скопировать и вставить в приведенный ниже код.

#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

 if(SYSTEM_VERSION_LESS_THAN(@"8.0"))
    {
        UIFont *customFont = [UIFont fontWithName:@"OpenSans-Light" size:32];
        self.registerLabel.font = customFont;  
    }

Надеюсь, это поможет, ура.


Спасибо! Я понял! Проблема заключалась в том, что я не добавлял его в вспомогательные файлы, поэтому он не загружался: P
— Хосе Мария

1
Я должен был использовать ключ Plist изUIAppFonts
— Майк Флинн

1
Я воссоздал свое приложение, весь проект из iOS7 / Xcode 5.1.1 в проект iOS8 / Xcode 6.0. Пользовательский шрифт не отображался, пока я не выполнил 2 шага. Gr8 объяснение!
— MB_iOSDeveloper

1
Тот же код для получения названий шрифтов в Swift: let fontFamilies = UIFont.familyNames() for familyName in fontFamilies { let fontNames = UIFont.fontNamesForFamilyName(familyName as String) println("\(familyName): \(fontNames)") }
— Александр Бекерт,

1
Какой-то быстрый код для печати всех названий шрифтов:for name in UIFont.familyNames() { debugPrint(UIFont.fontNamesForFamilyName(name)) }
— gimenete

24

Нет проблем использовать нестандартные шрифты, я это сделал. Следуй этим шагам:

  1. Зарегистрируйте шрифт в вашем info.plist, добавив запись «Шрифты, предоставленные приложением». Укажите имя файла шрифта, а не имя шрифта. Как font.ttf (думаю, вы это уже сделали)
  2. Перейдите к своему проекту в навигаторе проекта, щелкните имя проекта и перейдите к «этапам сборки», затем посмотрите вниз в «Копировать ресурсы пакета», перейдите в нижнюю часть, там много файлов, и найдите знак «+». Откроется всплывающее окно с файлами вашего проекта. Найдите свой файл шрифта и добавьте его в комплект.
  3. Наконец, проверьте название шрифта. Когда вы используете его в своем коде, вы должны использовать имя шрифта, а не имя файла. Чтобы узнать имя шрифта, дважды щелкните файл шрифта в Finder, и откроется окно с шрифтом. Проверьте заголовок окна, это имя шрифта, который вы должны использовать.

И совет, добавьте это имя как макрос в свой файл ..Prefix.pch. Его будет проще использовать в своем проекте, если вам придется использовать шрифт несколько раз.

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


2
Ключевым моментом для меня было название шрифта. Спасибо!
— Oscar

20

Чтобы добиться этого быстро

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

    UIFont.familyNames.forEach {
        print("fontFamily: \($0), fonts: \(UIFont.fontNames(forFamilyName: $0))")
    }

или сUIFont.familyNames.forEach { print("fontFamily: \($0), fonts: \(UIFont.fontNames(forFamilyName: $0))") }
— Daniel

5

Я никогда не мог заставить эти ответы работать, пробуя несколько раз. Единственный способ, которым у меня когда-либо был собственный шрифт, - следовать инструкциям в принятом ответе, а затем создать скрытую метку в раскадровке, которая использует шрифт. Я могу использовать шрифт программно. Странно и взломано, я знаю, но у меня это сработало.


1
вы совершенно правы. Я просмотрел все во многих руководствах, включая plist, отметку для целевого проекта, этапы сборки и, наконец, нашел правильное название семейства шрифтов, но это все равно не сработало. Затем я добавил скрытый ярлык, как вы говорите, и, наконец, он появился. Я использую Xcode 7.2, и это должно быть ошибка.
— DrZ214

3

Если вы используете Xcode 6, это очень просто. Просто добавьте fontпапку в свой проект, добавьте свой шрифт (ы) в папку, и все готово.

введите описание изображения здесь


7
Убедитесь, что вы добавили его к намеченной цели. Подлый хоббит Xcode.
— Мэтт Паркинс

3

Если ни один из вышеперечисленных методов не сработал для вас, И вы случайно используете свой собственный шрифт только «программно» (т.е. вы не использовали его ни в одном xib), тогда вам нужно будет использовать его хотя бы один раз где-нибудь в одном xib, где угодно .

(PS Стюарт Кларк - уже ответил на этот вопрос, так что не надо зачитывать меня, пожалуйста. Однако я решил перефразировать и опубликовать его как отдельный ответ, потому что я пропустил его ответ, мне было не ясно, когда я его читал. Я нашел случайно выбрал это решение, когда я тестировал настраиваемый шрифт в xib, и я увидел, что он работал в другом месте программно, но когда я удалил шрифт из xib, он перестал работать программно.)


2

Обновлено для Swift 3.

let fontFamilies:[String] = UIFont.familyNames

for fontFamily: String in fontFamilies {
    let fontNames: [String] = UIFont.fontNames(forFamilyName: fontFamily)
    print("\(fontFamily)  \(fontNames)");
}

0

Может быть, быстрое исправление - это помогло мне, когда шрифт уже работал, но новый, например, Label не отображал желаемый шрифт:

чистая, глубокая чистая и пустая папка производных данных.


0
please try below code.
@end
@implementation UILabel (CustomFont)
-(void)setFontName:(NSString *)value{
CGFloat newsize = (self.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self setFont:[UIFont fontWithName:self.font.fontName size:newsize]];
}
@end
@implementation UITextField (CustomFont)
-(void)setFontName:(NSString *)value{
CGFloat newsize = (self.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self setFont:[UIFont fontWithName:self.font.fontName size:newsize]];
}
@end
@implementation UIButton (CustomFont)
-(void)setFontName:(NSString *)value{
CGFloat newsize = (self.titleLabel.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self.titleLabel setFont:[UIFont fontWithName:self.titleLabel.font.fontName size:newsize]];
}
@end
@end

@interface UILabel (CustomFont)
-(void)setFontName:(NSString *)value;
@end
@interface UITextField (CustomFont)
-(void)setFontName:(NSString *)value;
@end
@interface UIButton (CustomFont)
-(void)setFontName:(NSString *)value;
@end
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.