Что случилось с "HelveticaNeue-Italic" на iOS 7.0.3
Просто обновил свой iPod touch до iOS 7.0.3 и "HelveticaNeue-Italic", похоже, исчез. Когда я запрашиваю по телефону с помощью:
[UIFont fontNamesForFamilyName:@"Helvetica Neue"]
Я получаю следующие имена шрифтов (13):
HelveticaNeue-BoldItalic,
HelveticaNeue-Light,
HelveticaNeue-UltraLightItalic,
HelveticaNeue-CondensedBold,
HelveticaNeue-MediumItalic,
HelveticaNeue-Thin,
HelveticaNeue-Medium,
HelveticaNeue-ThinItalic,
HelveticaNeue-LightItalic,
HelveticaNeue-UltraLight,
HelveticaNeue-Bold,
HelveticaNeue,
HelveticaNeue-CondensedBlack
Когда я выполняю тот же запрос, запущенный в симуляторе, я получаю (14):
HelveticaNeue-BoldItalic,
HelveticaNeue-Light,
**HelveticaNeue-Italic,**
HelveticaNeue-UltraLightItalic,
HelveticaNeue-CondensedBold,
HelveticaNeue-MediumItalic,
HelveticaNeue-Thin,
HelveticaNeue-Medium,
HelveticaNeue-Thin_Italic,
HelveticaNeue-LightItalic,
HelveticaNeue-UltraLight,
HelveticaNeue-Bold,
HelveticaNeue,
HelveticaNeue-CondensedBlack
Кто-нибудь еще видит это?
---- Новая информация ----
Я вернулся к видео WWDC 2013 "Использование шрифта с текстовым комплектом", и интересная часть начинается в 12:22. Ведущий рассказывает о "MetaFonts" в OS X в качестве примера. Он говорит, что шрифт под вызовами вроде:
+ (NSFont *)messageFontOfSize:(CGFloat)fontSize
не гарантируется возврат одного и того же основного шрифта в разных версиях или даже в разных целях. Его примером была Люсинда Гранде. Он, похоже, не говорил, что использование "HelveticaNeue-Italic" может уйти от версии к версии.
Итак, я построил эксперимент в iOS 7. Я создал свой шрифт со следующим кодом:
UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithName:@"Helvetica Neue" size:16.0];
UIFontDescriptor *symbolicFontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];
UIFont *fontWithDescriptor = [UIFont fontWithDescriptor:symbolicFontDescriptor size:16.0];
Я получил верный UIFont для fontWithDescriptor, и когда я запросил шрифт для fontName с помощью
[fontWithDescriptor fontName]
Я вернулся...
HelveticaNeue-Italic
Показать рисунок
Таким образом, возможным ответом на 7.0.3 представляется код выше.
---- Дальнейшая настройка ----
Хотя решение работало выше, я не думаю, что это формально правильно. Я перешел на следующее решение
UIFontDescriptor *fontDescriptor = [[UIFontDescriptor alloc] init];
UIFontDescriptor *fontDescriptorForHelveticaNeue = [fontDescriptor fontDescriptorWithFamily:@"Helvetica Neue"];
UIFontDescriptor *symbolicFontDescriptor = [fontDescriptorForHelveticaNeue fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];
textFont = [UIFont fontWithDescriptor:symbolicFontDescriptor size:textFontPointSize];
Это, кажется, делает все правильно. Я пробовал предыдущий подход с другим семейством шрифтов, и он, похоже, путался с именем fontName и fontFamily. Надеюсь, это поможет!
Ответы
Ответ 1
Это ошибка Apple. Он был введен в iOS 7.0.3 и еще не исправлен с iOS 7.0.4. Он, по-видимому, исправлен в предварительном просмотре iOS 7.1. Вот код (предоставленный Apple на форумах dev), чтобы обойти проблему:
#import <CoreText/CoreText.h>
CGFloat size = 14;
UIFont *font = [UIFont fontWithName:@"HelveticaNeue-Italic" size:size];
if (font == nil && ([UIFontDescriptor class] != nil)) {
font = (__bridge_transfer UIFont*)CTFontCreateWithName(CFSTR("HelveticaNeue-Italic"), size, NULL);
}
Также стоит отметить, что в текущей версии Xcode (5.0.1 (5A2053)) этот шрифт не указан как опция в выпадающем списке Font в Interface Builder. Поэтому, если вы предварительно настроили метку с этим шрифтом, вы заметите, что ui запутался, и ярлык заканчивается тем, что ему присваивается другой шрифт и размер во время выполнения (см. Ниже ui screencap). Для ярлыков, настроенных в раскадровках /xib, вам понадобится reset шрифт в коде.
Для справки здесь обсуждается проблема на форумах dev.
![enter image description here]()
Ответ 2
Это ошибка в iOS 7.0.3.
Если вы явно используете HelveticaNeue-Italic, вы можете создать его с помощью этого обходного пути:
UIFont* font = (__bridge_transfer UIFont*)CTFontCreateWithName(CFSTR("HelveticaNeue-Italic"), fontSize, NULL);
Обратите внимание, однако, что это обходное решение будет работать только на iOS 7; он не развертывается в iOS 6 (поскольку CTFontRef
и UIFont
не были бесплатными для моста на iOS 6). Однако на iOS 6 вы можете просто использовать обычный код поиска шрифтов.
Ответ 3
Я считаю, что это ошибка. Я подал его как таковой с Apple. К сожалению, для меня приложение теперь терпит крах. Шрифт используется в сторонней библиотеке, которую я использую. Многие люди в Twitter сообщают о проблемах.
Ответ 4
Если вы динамически просматриваете курсивный шрифт, вместо доступа к шрифту по имени
[UIFont fontWithName:@"HelveticaNeue-Italic" size:15.0f]
используйте [UIFont italicSystemFontOfSize:15.0f]
, это отлично работает для меня.
Ответ 5
В настоящее время я не нахожу сессию, но они сказали что-то, что вы не можете больше полагаться на шрифты, доступные на iOS7. Они могут даже измениться в течение всего срока действия вашего приложения. Что в основном означает: когда вы указываете шрифты в своем приложении, вы ввернуты, используйте вместо них шрифтовые дескрипторы или предпочтительные шрифты!
Ответ 6
Я нашел другое решение, которое, похоже, работает. Я вызвонил вызов
[[UIFont italicSystemFontOfSize:12.0] fontName]
чтобы узнать, что используется фактический используемый курсивный шрифт системы, и он вернул ".HelveticaNeueInterface-ItalicM3". Простой тест показывает, что использование
[UIFont fontWithName:@".HelveticaNeueInterface-ItalicM3" size:12.0]
работает! Сравнивая их визуально, шрифт, возвращаемый вышеуказанным вызовом, выглядит точно так же, как и исходный шрифт HelveticaNeue-Italic.
Эта проблема почти наверняка является ошибкой... Helvetica Neue является шрифтом по умолчанию в iOS 7, поэтому шрифты в этом семействе не должны отсутствовать. Все отлично работало в Xcode v.5.0, но сразу после обновления до 5.0.1 эта проблема возникла. Я подал ошибку, заметив Apple. До тех пор это решение, похоже, работает...
Ответ 7
Отчет об ошибке, который я подал с Apple, отмечен как "Закрыто как дубликат". Я надеюсь, что это означает, что они считают это ошибкой. Однако iOS 7.0.4 не исправляет ошибку.
Ответ 8
Исправлена ошибка в iOS 7.1 beta 1. [UIFont fontWithName:@"HelveticaNeue-Italic" size:size];
возвращает шрифт.
Ответ 9
Поскольку никто не упомянул о языковой поддержке HelveticaNeue в UIWebView, я решил поделиться своими выводами.
Как и в случае с 7.0.6, в UIWebView все еще отсутствует регулярный курсив и, похоже, возвращается к UltraLightItalic в том же семействе. Это выглядит немного странно, когда он находится рядом с обычным неточным текстом HelveticaNeue, поскольку он намного легче.
Моим обходным путем было использование обычной Helvetica вместо HelveticaNeue, но только для курсива. Итак, если у вас есть CSS, который выглядит так:
.myCssClass {
font-family:HelveticaNeue;
/* etc, etc */
}
... вы добавили бы два других класса для переопределения <i>
и <em>
:
.myCssClass i { font-family:Helvetica; }
.myCssClass em { font-family:Helvetica; }
Регулярный шрифт Helvetica italic выглядит отлично, и я не думаю, что кто-то заметил бы, что это не HelveticaNeue.
Ответ 10
У меня была такая же авария, которая использовалась для краха только в iOS 7.0.3 и 7.0.4, и отлично работает во всех других версиях. После столь большого расследования я узнал, что @ "HelveticaNeue-Italic" недоступен в версиях iOS 7.0.3 и 7.0.4, так что я использовал для этого превышение в этих версиях.
Я исправил проблему с помощью кода ниже, это может помочь кому-то нуждающемуся.
self.headerFont = [UIFont fontWithName:@"HelveticaNeue-Italic" size:16.0f];
if (self.headerFont == nil) {
self.headerFont = [UIFont fontWithName:@"HelveticaNeue" size:16.0f];
}
Журнал сбоев:
[__NSCFConstantString pointSize]: unrecognized selector sent to instance