Що сталося з “HelveticaNeue-Italic” на iOS 7.0.3


100

Щойно оновив свій 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. Сподіваюся, це допомагає!


Я теж це бачив. Не знаю, що сталося, але це цілком регрес.
ipodishima

Цікаво, що Сторінки на 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)) цей шрифт не вказаний як опція у спадному списку шрифтів у Interface Builder. Отже, якщо ви раніше налаштували мітку з цим шрифтом, ви помітите, що інтерфейс заплутаний, а мітка в кінці часу присвоює інший шрифт та розмір під час виконання (див. Скріншот ui нижче). Для міток, налаштованих на раскадровках / 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. На жаль для мене, додаток зараз виходить з ладу. Шрифт використовується в сторонній бібліотеці, яку я використовую. Багато людей у ​​Twitter повідомляють про проблеми.


1
FYI: Я щойно тестував, і помилка все ще існує в iOS 7.0.4.
Девід Ларі

3

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


Це, мабуть, найчистіша робота з цього питання. Якщо вам потрібна підтримка iOS 6, ви можете спробувати запустити fontWithName:size:спочатку, а якщо результат - nilзапустіть italicSystemFontOfSize:, який завжди повинен щось повернути, і принаймні уникнути збоїв.
SaltyNuts

2

Зараз я не знаходжу сеанс, але вони сказали щось, на що ви більше не можете розраховувати на те, що шрифти вже доступні на iOS7. Вони навіть можуть змінюватися протягом життя вашого додатка. Що в основному означає: Коли ви вказуєте шрифти у своїй програмі, ви накручуєте, використовуйте замість цього дескриптори шрифтів або бажані шрифти!


2
Найближча відповідність, яку я можу знайти, - це asciiwwdc.com/2013/sesions/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.