Что случилось с «HelveticaNeue-Italic» в iOS 7.0.3


100

Только что обновил свой iPod touch до iOS 7.0.3, и "HelveticaNeue-Italic", похоже, исчез. Когда я спрашиваю по телефону:

[UIFont fontNamesForFamilyName:@"Helvetica Neue"]

Я получаю следующие fontNames (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. Надеюсь это поможет!


Я тоже это видел. Не знаю, что случилось, но это регресс.
ipodishima

Интересно, что Pages на iOS 7.0.3 показывает Helvetica Neue Italic: i.stack.imgur.com/xpJKl.png
Лео Натан,

Итак, похоже, вы ответили на мой вопрос своим вопросом и исследованием, использование дескриптора шрифта действительно показывает курсивный шрифт на моем iPhone 7.0.3.
Рик ван дер Линде

Это также проблема в iOS 7.0.4
s.ka

Ответы:


31

Это ошибка Apple. Он был представлен в iOS 7.0.3 и еще не исправлен в iOS 7.0.4. Похоже, это исправлено в предварительной версии iOS 7.1 для разработчиков. Вот код (предоставленный Apple на форумах разработчиков) для решения проблемы:

#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)) этот шрифт не указан как опция в раскрывающемся списке «Шрифт» в Интерфейсном Разработчике. Итак, если вы ранее настроили метку с этим шрифтом, вы заметите, что пользовательский интерфейс запутан, и метке в конечном итоге назначается другой шрифт и размер во время выполнения (см. Снимок экрана пользовательского интерфейса ниже). Для меток, настроенных в раскадровках / xibs, вам нужно будет сбросить шрифт в коде.

Для справки здесь является обсуждение вопроса в Девых форумах.

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


Вы говорите, что заменили все свое использование чем-то другим. Чем вы его заменили? Мы заметили, что если вы замените его на HelveticaNeue-MediumItalic в файле XIB, мы получим неверные результаты в iOS 6 и более ранних версиях, потому что этот шрифт, похоже, был представлен в iOS 7.
GBegen

Я заменил его на HelveticaNeue-LightItalic. Не уверен, когда он был представлен. Мое приложение iOS7 +
Майк Восселлер,

7

Это ошибка в iOS 7.0.3.

Если вы явно используете HelveticaNeue-Italic, вы можете создать его, используя этот обходной путь:

UIFont* font = (__bridge_transfer UIFont*)CTFontCreateWithName(CFSTR("HelveticaNeue-Italic"), fontSize, NULL);

Обратите внимание, однако, что это временное решение будет работать только на iOS 7; это не развертываемое с прошивкой 6 (потому CTFontRefи UIFontне бесплатный мостиком на IOS 6). Однако в iOS 6 вы можете просто использовать свой обычный код поиска шрифтов.


4

Я считаю, что это ошибка. Я подал его как таковой в Apple. К сожалению для меня, в моем приложении происходит сбой. Шрифт используется в сторонней библиотеке, которую я использую. Многие люди в Твиттере сообщают о проблемах.


1
К вашему сведению: я только что протестировал, и ошибка все еще существует в iOS 7.0.4.
Дэвид Лари

3

Если вы динамически получить доступ к курсивному шрифту , то вместо того , чтобы получить доступ к шрифту по имени [UIFont fontWithName:@"HelveticaNeue-Italic" size:15.0f] использовать [UIFont italicSystemFontOfSize:15.0f]это работает отлично для меня.


Это, пожалуй, самый чистый способ решения этой проблемы. Если требуется поддержка iOS 6, вы можете fontWithName:size:сначала попробовать запустить , а если результат - nilзапустить italicSystemFontOfSize:, который всегда должен что-то возвращать и, по крайней мере, избегать сбоев.
SaltyNuts 06

2

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


2
Ближайшее совпадение, которое я могу найти, - asciiwwdc.com/2013/sessions/223 , но похоже, что они относятся к загружаемым шрифтам, а не к шрифтам, предоставляемым системой.
Хилтон Кэмпбелл,

См. Новую информацию выше. Я думаю, что докладчик говорит, что вы не можете рассчитывать на сопоставление «MetaFonts» с одними и теми же базовыми шрифтами в разных версиях или даже в использовании. Я не думаю, что он говорит о возможности того, что что-то вроде "HelveticaNeue-Italic" когда-нибудь исчезнет.
Скотт Сарниковски

1

Я нашел другое решение, которое, кажется, работает. Я отключился от звонка

[[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, отметив это. А пока это решение, кажется, работает ...


1

Отчет об ошибке, который я отправил в Apple, был помечен как «Закрыто как дубликат». Я надеюсь, что это означает, что они действительно считают это ошибкой. Однако iOS 7.0.4 не исправляет ошибку.


1
Я получил такой же ответ. Надеюсь, они это исправят.
Скотт Сарниковски


0

У меня был такой же сбой, который раньше вызывал сбой только в 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 

-1

Поскольку никто ничего не упомянул о поддержке курсива 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 выглядит нормально, и я не думаю, что кто-то заметил бы, что это не HelveticaNeue.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.