O que aconteceu com “HelveticaNeue-Italic” no iOS 7.0.3

100

Acabei de atualizar meu iPod touch para iOS 7.0.3 e "HelveticaNeue-Italic" parece ter desaparecido. Quando faço uma consulta ao telefone com:

[UIFont fontNamesForFamilyName:@"Helvetica Neue"]

Eu obtenho os seguintes 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

Quando faço a mesma consulta em execução no simulador, recebo (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

Alguém mais viu isso?

---- Nova informação ----

Voltei para o vídeo WWDC 2013 "Using Font with Text Kit" e a parte interessante começa às 12h22. O apresentador fala sobre "MetaFonts" no OS X como um exemplo. O que ele diz é que a fonte em chamadas como:

+ (NSFont *)messageFontOfSize:(CGFloat)fontSize

não é garantido que retornem a mesma fonte subjacente em todas as versões ou mesmo em usos diferentes. Seu exemplo foi Lucinda Grande. Ele não parecia estar dizendo que o uso de "HelveticaNeue-Italic" poderia ir de uma versão para outra.

Então, construí um experimento no iOS 7. Criei minha fonte com o seguinte código:

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

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

Eu recebi um UIFont válido para fontWithDescriptor e quando consultei a fonte para fontName com:

[fontWithDescriptor fontName]

Eu voltei...

HelveticaNeue-Italic

Vai saber???

Portanto, uma possível resposta para 7.0.3 parece ser o código acima.

---- Ajustes adicionais ----

Embora a solução tenha funcionado acima, não acho que seja formalmente correta. Eu mudei para a seguinte solução

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

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

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

Isso parece fazer todas as coisas certas. Eu tentei a abordagem anterior com outra família de fontes e pareceu ficar confusa com the fontName e fontFamily. Espero que isto ajude!

Scott Sarnikowski
fonte
Eu também vi isso. Não sei o que aconteceu, mas é uma verdadeira regressão.
ipodishima
Curiosamente, o Pages no iOS 7.0.3 mostra Helvetica Neue Italic: i.stack.imgur.com/xpJKl.png
Leo Natan
Portanto, parece que você respondeu minha pergunta com sua própria pergunta e pesquisa, usando o descritor de fonte está realmente mostrando a fonte em itálico no meu iPhone 7.0.3.
Rick van der Linde
Este também é um problema no iOS 7.0.4
s.ka

Respostas:

31

Este é um bug da Apple. Ele foi introduzido no iOS 7.0.3 e ainda não foi corrigido no iOS 7.0.4. Parece ter sido corrigido na visualização do desenvolvedor do iOS 7.1. Aqui está o código (fornecido pela Apple nos fóruns de desenvolvimento) para solucionar o problema:

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

Também é importante notar que na versão atual do Xcode (5.0.1 (5A2053)) esta fonte não está listada como uma opção na lista suspensa Fonte no Interface Builder. Portanto, se você configurou anteriormente um rótulo com esta fonte, notará que a interface do usuário fica confusa e o rótulo acaba sendo atribuído a alguma outra fonte e tamanho no tempo de execução (veja o screencap da ui abaixo). Para rótulos configurados em storyboards / xibs, você precisará redefinir a fonte no código.

Para referência, aqui está a discussão do problema nos fóruns de desenvolvimento.

insira a descrição da imagem aqui

Mike Vosseller
fonte
Você diz que substituiu todos os seus usos por outra coisa. Com o que você o substituiu? Observamos que se você substituí-la por HelveticaNeue-MediumItalic no arquivo XIB, obteremos resultados incorretos no iOS 6 e anteriores porque essa fonte parece ter sido introduzida no iOS 7.
GBegen
Substituí-o por HelveticaNeue-LightItalic. Não tenho certeza de quando foi introduzido. Meu aplicativo é iOS7 +
Mike Vosseller
7

Este é um bug no iOS 7.0.3.

Se você estiver usando explicitamente HelveticaNeue-Italic, poderá criá-lo usando esta solução alternativa:

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

Observe, no entanto, que essa solução alternativa funcionará apenas no iOS 7; não pode ser implantado no iOS 6 (porque CTFontRefe UIFontnão eram interligados gratuitamente no iOS 6). No entanto, no iOS 6, você pode apenas usar seu código de pesquisa de fonte normal.

Dave DeLong
fonte
4

É minha convicção que é um bug. Eu arquivei assim com a Apple. Infelizmente para mim, meu aplicativo está falhando. A fonte é usada em uma biblioteca de terceiros que estou usando. Muitas pessoas no Twitter estão relatando problemas.

David Lari
fonte
1
FYI: Acabei de testar e o bug ainda existe no iOS 7.0.4.
David Lari
3

Se você estiver acessando dinamicamente a fonte em itálico, em vez de acessar a fonte por nome, [UIFont fontWithName:@"HelveticaNeue-Italic" size:15.0f] use [UIFont italicSystemFontOfSize:15.0f]isso está funcionando bem para mim.

Kapil Chandel
fonte
Esta é talvez a solução mais limpa para esse problema. Se o suporte do iOS 6 for necessário, você pode tentar executar fontWithName:size:primeiro e, se o resultado for nil, execute italicSystemFontOfSize:, que sempre deve retornar algo e pelo menos evitar um travamento.
SaltyNuts
2

Atualmente não encontro a sessão, mas eles disseram algo que você não pode mais contar com as fontes disponíveis no iOS7. Eles podem até mudar durante a vida útil do seu aplicativo. O que basicamente significa: Quando você especifica fontes em seu aplicativo, você está confuso, use descritores de fonte ou fontes preferidas em vez disso!

Michael Ochs
fonte
2
A correspondência mais próxima que consigo encontrar é asciiwwdc.com/2013/sessions/223 , mas parece que eles estão se referindo a fontes para download, não a fontes fornecidas pelo sistema.
Hilton Campbell
Veja as novas informações acima. Acho que o que o apresentador está dizendo é que você não pode contar com o mapeamento "MetaFonts" para as mesmas fontes subjacentes em todas as versões ou até mesmo em usos. Não acho que ele está dizendo que é mesmo uma possibilidade de que algo como "HelveticaNeue-Italic" possa ir embora.
Scott Sarnikowski
1

Encontrei outra solução que parece funcionar. Eu desliguei uma chamada para

[[UIFont italicSystemFontOfSize:12.0] fontName]

para ver qual é a fonte real em itálico do sistema que está sendo usada e retornou ".HelveticaNeueInterface-ItalicM3". Um teste simples mostra que usando

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

trabalho! Comparando-as visualmente, a fonte retornada pela chamada acima parece ser exatamente a mesma que a fonte 'HelveticaNeue-Italic' original.

Este problema é quase certamente um bug ... Helvetica Neue é a fonte padrão no iOS 7, então as fontes dessa família não devem faltar. Tudo funcionou bem no Xcode v.5.0, mas imediatamente após a atualização para 5.0.1, esse problema começou a aparecer. Eu registrei um bug com a Apple observando tanto. Até então, essa solução parece funcionar ...

Fateh Khalsa
fonte
1

O relatório de bug que preenchi com a Apple foi marcado como "Fechado como duplicado". Tenho esperança de que isso signifique que eles o consideram um bug. No entanto, o iOS 7.0.4 não corrige o bug.

David Lari
fonte
1
Eu obtive a mesma resposta. Espero que eles consertem.
Scott Sarnikowski
1

O bug parece ter sido corrigido no iOS 7.1 beta 1. [UIFont fontWithName:@"HelveticaNeue-Italic" size:size];retorna uma fonte.

Leo Natan
fonte
Boas notícias, mas ainda está sob o NDA.
Vincent Tourraine
9
Vou correr esse risco.
Leo Natan
0

Eu tive um mesmo travamento que costumava travar apenas no iOS 7.0.3 e 7.0.4, e funciona perfeitamente em todas as outras versões. Depois de tanta investigação, descobri que @ "HelveticaNeue-Italic" não está disponível nas versões iOS 7.0.3 e 7.0.4, de modo que costumava ficar acima do travamento nessas versões.

Corrigi o problema com o código abaixo, isso pode ser útil para alguém necessitado.

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

O registro de travamento é:

[__NSCFConstantString pointSize]: unrecognized selector sent to instance 
Suresh Durishetti
fonte
-1

Como ninguém mencionou nada sobre o suporte a itálico HelveticaNeue no UIWebView, pensei em compartilhar minhas descobertas.

A partir de 7.0.6, o itálico regular ainda está faltando em UIWebView e parece cair para UltraLightItalic na mesma família. Isso parece um pouco estranho quando está ao lado de um texto HelveticaNeue de peso normal sem itálico, pois é muito mais leve.

Minha solução alternativa foi usar Helvetica comum em vez de HelveticaNeue, mas apenas para o itálico. Portanto, se você tiver CSS parecido com este:

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

... você adicionaria duas outras classes para substituir <i>e <em>:

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

A fonte Helvetica italic normal parece boa e não acho que alguém notaria que não é HelveticaNeue.

Brian Rak
fonte