Некоторые шрифты не отображаются?

У меня есть список имен шрифтов в моем приложении, которые все отображаются в шрифте, который они представляют. Следующие три не работают:

ArialRoundedMTBold
ChalkboardSE-Bold
TrebuchetMS-Жирный

Вместо этого они отображаются в стандартном шрифте.

Любые идеи, почему они могут не отображаться?

Ответ 1

Как настроить пользовательский шрифт

Чтобы использовать пользовательский шрифт (один из них не включен в iOS), вы должны отредактировать свой файл <appname>-Info.plist и создать новый UIAppFonts ключ с массивом типов, где каждый элемент массива - это строка с именем вашего файл шрифта. Пример: VAGRoundedStd-Light.ttf. Вы также должны добавить файл в свой проект.

UIAppFonts

Примечание. Когда вы набираете UIAppFonts и нажимаете клавишу ввода, ключ преобразуется в "Шрифты, предоставляемые приложением".

Однако, когда вы используете шрифт в Interface Builder (или с UIFont), вы не используете имя шрифта, а имя, которое появляется при открытии шрифта в приложении Font Book вашего Mac. Для предыдущего примера это будет VAG Rounded Std Light.

Font Book

OS X более толерантна, чем iOS, переваривая форматы TrueType, поэтому в редких случаях вы можете найти шрифт, который работает в OS X, но не в iOS. Если это произойдет, замените шрифт, чтобы узнать, правильно ли вы получили этот процесс.

Как загрузить шрифт программно

Это разрешает случай, когда лицензия на шрифт требует, чтобы вы распространяли шрифт в зашифрованном виде.

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

Этот следующий рецепт от Загрузка шрифтов iOS динамически от Marco Arment. Это делает шрифты доступны в UIFont и UIWebView. Один и тот же код можно использовать для загрузки шрифтов из Интернета.

NSData *inData = /* your decrypted font-file data */;
CFErrorRef error;
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)inData);
CGFontRef font = CGFontCreateWithDataProvider(provider);
if (! CTFontManagerRegisterGraphicsFont(font, &error)) {
    CFStringRef errorDescription = CFErrorCopyDescription(error)
    NSLog(@"Failed to load font: %@", errorDescription);
    CFRelease(errorDescription);
}
CFRelease(font);
CFRelease(provider);

Как загрузить более двух шрифтов одного семейства

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

Вот способ обхода кода из пользователя stackoverflow Evadne Wu. Просто добавьте следующее в делегат приложения (обратите внимание, что он использует две фреймворки):

#import <CoreText/CoreText.h>
#import <MobileCoreServices/MobileCoreServices.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    CTFontManagerRegisterFontsForURLs((__bridge CFArrayRef)((^{
        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSURL *resourceURL = [[NSBundle mainBundle] resourceURL];
        NSArray *resourceURLs = [fileManager contentsOfDirectoryAtURL:resourceURL includingPropertiesForKeys:nil options:0 error:nil];
        return [resourceURLs filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSURL *url, NSDictionary *bindings) {
            CFStringRef pathExtension = (__bridge CFStringRef)[url pathExtension];
            NSArray *allIdentifiers = (__bridge_transfer NSArray *)UTTypeCreateAllIdentifiersForTag(kUTTagClassFilenameExtension, pathExtension, CFSTR("public.font"));
            if (![allIdentifiers count]) {
                return NO;
            }
            CFStringRef utType = (__bridge CFStringRef)[allIdentifiers lastObject];
            return (!CFStringHasPrefix(utType, CFSTR("dyn.")) && UTTypeConformsTo(utType, CFSTR("public.font")));

        }]];
    })()), kCTFontManagerScopeProcess, nil);

    return YES;
}

Доступно как gist. Комментарий в блоге автора: Загрузка 2 + шрифтов в iOS из того же семейства шрифтов.


Альтернативный, более связанный с решением проблемы pixeldock.com:

Если вы добавляете более двух вариантов шрифтов одного семейства шрифтов (например, "Нормальный", "Жирный" и "Расширенный" ), только два последних варианта шрифта, которые вы добавили в проект.

Если вы это видите, это ограничение вашей версии SDK, и единственный выход из нее - это редактирование семейства шрифтов с помощью редактора шрифтов, такого как Fontforge. Опять же, из pixeldock.com:

  • Откройте свой шрифт в Fontforge
  • Goto 'Element → ' Font Info и измените поле "Фамилия"
  • Goto 'Element → ' TTF Имена и изменение полей "Семья" и "Предпочтительное семейство"
  • Перейти к "Файл → " Сгенерировать шрифты и сохранить отредактированный шрифт

Ответ 2

В iOS доступно только подмножество шрифтов Mac OS. Если вы установите шрифт, который недоступен, он будет отображаться как стандартный Helvetica.

Ответ 3

Я использовал шрифт Google с именем Arvo. Он имел следующие файлы:

Арво-Regular.ttf Арво-Bold.ttf Арво-BoldItalic.ttf Арво-Italic.ttf Эти имена были добавлены в мое приложение info.plist, но по какой-то причине мое приложение могло читать только жирные, смелые и курсивные шрифты. Он не мог прочитать обычный шрифт, когда я пытался его загрузить. Однако после распечатки имен шрифтов выяснилось, что Arvo-Regular был признан Arvo в моем приложении.

Ответ 4

У меня была аналогичная проблема с тем, что я не нашел Chalkduster, хотя IB перечислил его как шрифт и был указан как шрифт IOS. Я обнаружил, что список шрифтов на iPhone и iPad не идентичен.

Chalkduster доступен для iPad, но не для iPhone. Классная доска доступна на iPad 4.x, но не 3.x. Он доступен на iPhone 3.x и 4.x.

Подробнее здесь: http://www.whatsyourdigitaliq.com/2011/05/11/fonts-available-in-various-versions-of-ios/

Ответ 5

Откройте приложение "Шрифтовая книга". Если вы сами установили шрифты, перейдите к пользователю, найдите нужные шрифты и используйте имя шрифта PostScript в проекте xcode.

Он должен работать даже для разных вариантов шрифта одного семейства.