Подтвердить что ты не робот

Что случилось с "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. Надеюсь, это поможет!

4b9b3361

Ответ 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