Co się stało z „HelveticaNeue-Italic” w systemie iOS 7.0.3


100

Właśnie zaktualizowałem iPoda touch do iOS 7.0.3 i wydaje się, że „HelveticaNeue-Italic” zniknął. Kiedy pytam telefonicznie z:

[UIFont fontNamesForFamilyName:@"Helvetica Neue"]

Otrzymuję następujące 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

Kiedy robię to samo zapytanie działające w symulatorze, otrzymuję (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

Czy ktoś jeszcze to widział?

---- Nowa informacja ----

Wróciłem do wideo WWDC 2013 „Using Font with Text Kit” i interesująca część zaczyna się o 12:22. Prezenter mówi o „MetaFonts” w systemie OS X jako przykład. Mówi, że czcionka pod nazwami wygląda tak:

+ (NSFont *)messageFontOfSize:(CGFloat)fontSize

nie gwarantuje się zwrócenia tej samej podstawowej czcionki w różnych wersjach, a nawet w różnych zastosowaniach. Jego przykładem była Lucinda Grande. Nie wydawał się mówić, że używanie „HelveticaNeue-Italic” może odejść od wersji do wersji.

Skonstruowałem więc eksperyment w iOS 7. Utworzyłem swoją czcionkę za pomocą następującego kodu:

UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithName:@"Helvetica Neue" size:16.0];
UIFontDescriptor *symbolicFontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];

UIFont *fontWithDescriptor = [UIFont fontWithDescriptor:symbolicFontDescriptor size:16.0];

Otrzymałem poprawny UIFont z powrotem dla fontWithDescriptor i kiedy zapytałem o czcionkę dla fontName za pomocą:

[fontWithDescriptor fontName]

Wróciłem...

HelveticaNeue-Italic

Domyśl???

Zatem możliwą odpowiedzią na 7.0.3 wydaje się być powyższy kod.

---- Dalsze poprawki ----

Chociaż rozwiązanie zadziałało powyżej, nie sądzę, aby było poprawne formalnie. Przerzuciłem się na następujące rozwiązanie

    UIFontDescriptor *fontDescriptor = [[UIFontDescriptor alloc] init];

    UIFontDescriptor *fontDescriptorForHelveticaNeue = [fontDescriptor fontDescriptorWithFamily:@"Helvetica Neue"];
    UIFontDescriptor *symbolicFontDescriptor = [fontDescriptorForHelveticaNeue fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];

    textFont = [UIFont fontWithDescriptor:symbolicFontDescriptor size:textFontPointSize];

To wydaje się robić wszystkie właściwe rzeczy. Wypróbowałem poprzednie podejście z inną rodziną czcionek i wydawało się, że pomyliłem się z fontName i fontFamily. Mam nadzieję że to pomoże!


Też to widziałem. Nie wiem, co się stało, ale to dość regresja.
ipodishima

Co ciekawe, Pages na iOS 7.0.3 pokazuje Helvetica Neue Italic: i.stack.imgur.com/xpJKl.png
Leo Natan

Wygląda więc na to, że odpowiedziałeś na moje pytanie własnym pytaniem i badaniami, używając deskryptora czcionki rzeczywiście pokazuje czcionkę kursywą na moim iPhonie 7.0.3.
Rick van der Linde

Jest to również problem w iOS 7.0.4
s.ka

Odpowiedzi:


31

To jest błąd Apple. Został wprowadzony w iOS 7.0.3 i nie został jeszcze naprawiony w iOS 7.0.4. Wygląda na to, że problem został rozwiązany w podglądzie programisty iOS 7.1. Oto kod (dostarczony przez firmę Apple na forach deweloperów) umożliwiający obejście problemu:

#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);
}

Warto również zauważyć, że w aktualnej wersji Xcode (5.0.1 (5A2053)) ta czcionka nie jest wymieniona jako opcja na liście rozwijanej Czcionka w Interface Builder. Więc jeśli wcześniej skonfigurowałeś etykietę z tą czcionką, zauważysz, że interfejs użytkownika jest zdezorientowany, a etykieta kończy się przypisaniem innej czcionki i rozmiaru w czasie wykonywania (patrz zrzut ekranu interfejsu użytkownika poniżej). W przypadku etykiet skonfigurowanych w scenorysach / xibs będziesz musiał zresetować czcionkę w kodzie.

Jako odniesienie tutaj jest dyskusja na temat tego problemu na forach deweloperów.

wprowadź opis obrazu tutaj


Mówisz, że zastąpiłeś wszystkie swoje zastosowania czymś innym. Czym go zastąpiłeś? Zauważyliśmy, że jeśli zastąpisz ją HelveticaNeue-MediumItalic w pliku XIB, otrzymamy niepoprawne wyniki na iOS 6 i wcześniejszych, ponieważ wydaje się, że ta czcionka została wprowadzona w iOS 7.
GBegen

Zastąpiłem go HelveticaNeue-LightItalic. Nie jestem pewien, kiedy został wprowadzony. Moja aplikacja to iOS7 +
Mike Vosseller

7

To jest błąd w iOS 7.0.3.

Jeśli jawnie używasz HelveticaNeue-Italic, możesz go utworzyć, korzystając z tego obejścia:

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

Należy jednak pamiętać, że to obejście będzie działać tylko w systemie iOS 7; nie można go wdrożyć w systemie iOS 6 (ponieważ CTFontRefi UIFontnie były one bezpłatne w połączeniu z systemem iOS 6). Jednak w systemie iOS 6 możesz po prostu użyć zwykłego kodu wyszukiwania czcionek.


4

Wierzę, że to błąd. Zgłosiłem to jako takie w Apple. Niestety, moja aplikacja się teraz zawiesza. Czcionka jest używana w bibliotece innej firmy, której używam. Wiele osób na Twitterze zgłasza problemy.


1
FYI: Właśnie przetestowałem i błąd nadal istnieje w iOS 7.0.4.
David Lari

3

Jeśli dynamicznie dostępu do kursywą wtedy zamiast dostępu czcionkę o nazwie [UIFont fontWithName:@"HelveticaNeue-Italic" size:15.0f] użyć [UIFont italicSystemFontOfSize:15.0f]to działa dobrze dla mnie.


To chyba najczystsze rozwiązanie tego problemu. Jeśli wymagana jest obsługa iOS 6, możesz fontWithName:size:najpierw spróbować uruchomić , a jeśli wynik jest nil, uruchom italicSystemFontOfSize:, co zawsze powinno zwrócić coś, a przynajmniej uniknąć awarii.
SaltyNuts

2

Obecnie nie znajduję sesji, ale powiedzieli coś, że nie można już polegać na czcionkach, które są już dostępne na iOS7. Mogą się zmieniać nawet w okresie użytkowania aplikacji. Co w zasadzie oznacza: określając czcionki w swojej aplikacji, nie masz nic przeciwko, zamiast tego użyj deskryptorów czcionek lub preferowanych czcionek!


2
Najbliższe dopasowanie, które mogę znaleźć, to asciiwwdc.com/2013/sessions/223 , ale wygląda na to, że odnoszą się do czcionek do pobrania, a nie czcionek dostarczonych przez system.
Hilton Campbell

Zobacz nowe informacje powyżej. Myślę, że prezenter mówi, że nie można liczyć na odwzorowanie „MetaFonts” na te same podstawowe czcionki w różnych wersjach, a nawet zastosowaniach. Nie sądzę, żeby mówił, że jest nawet możliwość, że coś takiego jak „HelveticaNeue-Italic” kiedykolwiek zniknie.
Scott Sarnikowski

1

Znalazłem inne rozwiązanie, które wydaje się działać. Wylogowałem się z połączenia

[[UIFont italicSystemFontOfSize:12.0] fontName]

aby zobaczyć, jaka jest aktualnie używana czcionka systemowa, i zwróciło „.HelveticaNeueInterface-ItalicM3”. Prosty test pokazuje, że użycie

[UIFont fontWithName:@".HelveticaNeueInterface-ItalicM3" size:12.0]

Pracuje! Porównując je wizualnie, czcionka zwrócona w powyższym wywołaniu wydaje się być dokładnie taka sama, jak oryginalna czcionka „HelveticaNeue-Italic”.

Ten problem jest prawie na pewno błędem ... Helvetica Neue jest domyślną czcionką w iOS 7, więc nie powinno zabraknąć czcionek z tej rodziny. Wszystko działało dobrze w Xcode v.5.0, ale natychmiast po aktualizacji do 5.0.1 ten problem zaczął się pojawiać. Zgłosiłem błąd, zwracając uwagę Apple. Do tego czasu to rozwiązanie wydaje się działać ...


1

Raport o błędzie, który złożyłem w Apple, został oznaczony jako „Zamknięty jako duplikat”. Mam nadzieję, że oznacza to, że uważają to za błąd. Jednak iOS 7.0.4 nie naprawia błędu.


1
Otrzymałem tę samą odpowiedź. Mam nadzieję, że to naprawią.
Scott Sarnikowski

1

Wygląda na to, że błąd został naprawiony w iOS 7.1 beta 1. [UIFont fontWithName:@"HelveticaNeue-Italic" size:size];zwraca czcionkę.


Dobra wiadomość, ale to nadal objęte umową o zachowaniu poufności.
Vincent Tourraine

9
Podejmę to ryzyko.
Leo Natan

0

Miałem taką samą awarię, która miała miejsce tylko w iOS 7.0.3 i 7.0.4 i działa doskonale we wszystkich innych wersjach. Po tak długim śledztwie dowiedziałem się, że @ "HelveticaNeue-Italic" nie jest dostępne w wersjach iOS 7.0.3 i 7.0.4, więc w tych wersjach pojawiałem się powyżej awarii.

Naprawiłem problem z poniższym kodem, może to być pomocne dla kogoś potrzebującego.

self.headerFont = [UIFont fontWithName:@"HelveticaNeue-Italic" size:16.0f];
if (self.headerFont == nil) {
    self.headerFont = [UIFont fontWithName:@"HelveticaNeue" size:16.0f];
}

Dziennik awarii to:

[__NSCFConstantString pointSize]: unrecognized selector sent to instance 

-1

Ponieważ nikt nie wspomniał nic o obsłudze kursywy HelveticaNeue w UIWebView, pomyślałem, że podzielę się swoimi odkryciami.

Od wersji 7.0.6 nadal brakuje zwykłej kursywy w UIWebView i wydaje się, że w tej samej rodzinie powraca do UltraLightItalic. Wygląda to trochę dziwnie, gdy znajduje się tuż obok tekstu HelveticaNeue bez kursywy, ponieważ jest o wiele jaśniejszy.

Moje obejście polegało na użyciu zwykłej Helvetica zamiast HelveticaNeue, ale tylko dla kursywy. Więc jeśli masz CSS, który wygląda tak:

.myCssClass {
    font-family:HelveticaNeue;
    /* etc, etc */
}

... dodałbyś dwie inne klasy do zastąpienia <i>i <em>:

.myCssClass i  { font-family:Helvetica; }
.myCssClass em { font-family:Helvetica; }

Zwykła kursywa Helvetica wygląda dobrze i nie sądzę, by ktokolwiek zauważył, że to nie jest HelveticaNeue.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.