Пользовательские шрифты в 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))")
    }
Toye
источник
или с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
Herry.master
источник