Fontes personalizadas no iOS 7

102

Estou desenvolvendo um jogo e gostaria de usar uma fonte personalizada em meu aplicativo. Estou usando o SpriteKit para isso, se isso for importante. Eu tentei usar este https://github.com/deni2s/IBCustomFonts, mas não consigo fazê-lo funcionar com esta fonte http://www.fontspace.com/freaky-fonts/emulogic

Já tentei várias coisas e registrei a fonte no info.plist do app ... Alguém sabe o que está acontecendo?

José María
fonte
Tem certeza de que está usando o nome correto da fonte ao usá-la em seu código?
Nick
1
este blog pode ser útil para você codewithchris.com/…
Xu Yin

Respostas:

277

Em primeiro lugar, estou assumindo que o SpriteKit não faz nenhuma diferença.

  1. Você precisa da sua fonte em .otf ou .ttf copiada para o seu projeto. Por exemplo, em Arquivos de Suporte.
  2. Você precisa editar o arquivo .plist . Adicione a chave "Fontes fornecidas pelo aplicativo" em seu plist e no Item 0 copie o nome de arquivo exato da fonte que você copiou para seus Arquivos de suporte COM extensão. Por exemplo: "JosefinSansStd-Light_0.otf"
  3. Certifique-se de que a fonte que você importou para o seu aplicativo está sendo compactada no próprio aplicativo. Faça isso selecionando seu destino , em seguida, Build Phases e Copiar recursos de pacote . Se você não vir sua fonte lá, arraste-a dos Arquivos de Suporte .

Finalmente, você gostaria de listar todas as suas fontes quando o aplicativo for iniciado, apenas para ver o nome utilizável para a sua fonte. Você fará isso com este pequeno trecho de código:

NSArray *fontFamilies = [UIFont familyNames];
for (int i = 0; i < [fontFamilies count]; i++)
{
    NSString *fontFamily = [fontFamilies objectAtIndex:i];
    NSArray *fontNames = [UIFont fontNamesForFamilyName:[fontFamilies objectAtIndex:i]];
    NSLog (@"%@: %@", fontFamily, fontNames);
}

Pesquise sua fonte nos resultados impressos, por exemplo, eu pesquisaria por "Josefin" e veria que o nome real da fonte é "JosefinSansStd-Light". Depois disso, você só precisa usar essa fonte:

UIFont *customFont = [UIFont fontWithName:@"JosefinSansStd-Light" size:20];

No iOS8, você adiciona suas fontes diretamente ao projeto e elas ficam visíveis no construtor de interface. Modifique seu código para dar conta disso, mas definindo a fonte de maneira programática para iOS7 e selecionando-a no construtor de interface xCode6. PS. O construtor de interface no xCode6 fornece o nome da fonte correto que você pode copiar e colar no código abaixo.

#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

 if(SYSTEM_VERSION_LESS_THAN(@"8.0"))
    {
        UIFont *customFont = [UIFont fontWithName:@"OpenSans-Light" size:32];
        self.registerLabel.font = customFont;  
    }

Espero que isso ajude, gritos.

Jovanjovanovic
fonte
Obrigado! Deixa comigo! O problema era que eu não queria adicioná-lo aos Arquivos de Suporte, então ele não estava carregando: P
José María
1
Tive que usar a chave plist deUIAppFonts
Mike Flynn
1
Recriei meu aplicativo, todo o projeto do iOS7 / Xcode 5.1.1 em um projeto iOS8 / Xcode 6.0. A fonte personalizada não estava aparecendo até que eu fiz a 2. etapa. Explicação Gr8!
MB_iOSDeveloper
1
O mesmo código para obter nomes de fontes em Swift: let fontFamilies = UIFont.familyNames() for familyName in fontFamilies { let fontNames = UIFont.fontNamesForFamilyName(familyName as String) println("\(familyName): \(fontNames)") }
Alexander Bekert
1
Algum código rápido para imprimir todos os nomes de fontes:for name in UIFont.familyNames() { debugPrint(UIFont.fontNamesForFamilyName(name)) }
gimenete
24

Não há problema em usar fontes personalizadas, eu fiz isso. Siga esses passos:

  1. Registre a fonte em seu info.plist adicionando a entrada "Fontes fornecidas pelo aplicativo". Coloque o nome do arquivo da fonte, não o nome da fonte. Como font.ttf (acho que você já fez isso)
  2. Vá para o seu projeto no navegador do projeto, clique no nome do projeto e vá para "fases de construção", em seguida, olhe para baixo em "Copiar recursos do pacote", vá para o final, há muitos arquivos e procure o sinal "+". Uma janela pop-up será aberta com seus arquivos de projeto. Procure seu arquivo de fonte e adicione-o ao pacote.
  3. Por fim, verifique o nome da fonte. Ao usá-lo em seu código, você deve usar o nome da fonte, não o nome do arquivo. Para saber o nome da fonte, clique duas vezes no arquivo da fonte no Finder e uma janela se abrirá mostrando a fonte. Verifique o título da janela, esse é o nome da fonte que você deve usar.

E conselho, adicione esse nome como uma macro em seu arquivo ..Prefix.pch. Será mais fácil usá-lo em seu projeto se você tiver que usar a fonte várias vezes.

O problema que acho que você teve é ​​que você registrou corretamente a fonte, mas ela não foi copiada para o pacote de aplicativos. Portanto, quando o aplicativo foi executado, ele não conseguiu encontrar a fonte. É por isso que a etapa 2 é importante. Passei muito tempo tentando descobrir isso da primeira vez :)

Zago
fonte
2
A chave para mim era o título da fonte. Obrigado!
Oscar
20

Para conseguir isso rapidamente

Se você gostaria de listar todas as suas fontes quando o aplicativo for iniciado, apenas para ver o nome utilizável para sua fonte. Você pode fazer isso com este pequeno trecho de código:

    UIFont.familyNames.forEach {
        print("fontFamily: \($0), fonts: \(UIFont.fontNames(forFamilyName: $0))")
    }
Toye
fonte
ou comUIFont.familyNames.forEach { print("fontFamily: \($0), fonts: \(UIFont.fontNames(forFamilyName: $0))") }
Daniel
5

Nunca consegui fazer essas respostas funcionarem, depois de tentar várias vezes. A única maneira que tenho uma fonte personalizada para seguir as instruções na resposta aceita, em seguida, criar um rótulo oculto no storyboard que usa a fonte. Posso usar a fonte de maneira programática. Estranho e hacky eu sei, mas funcionou para mim.

Stuart Clark
fonte
1
você está exatamente certo. Eu olhei para tudo em muitos tutoriais, incluindo o plist, a marca de seleção para direcionar o projeto, fases de construção e, finalmente, encontrei o nome da família de fontes correto, mas ainda não funcionou. Então eu adicionei um rótulo oculto como você diz e finalmente ele apareceu. Estou usando o Xcode 7.2 e deve ser um bug.
DrZ214
3

Se você estiver no Xcode 6, é tão fácil quanto parece. Basta adicionar uma fontpasta ao seu projeto, adicionar sua (s) fonte (s) à pasta e pronto.

insira a descrição da imagem aqui

Idris
fonte
7
Certifique-se de adicioná-lo ao seu destino pretendido também. Xcode hobbit sorrateiro.
Matt Parkins
3

Se nenhum dos métodos acima funcionou para você, E acontece de você usar sua fonte personalizada "programaticamente" apenas (ou seja, você não a usou em nenhum xib), então você precisará usá-la pelo menos uma vez em algum lugar em um xib, em qualquer lugar .

(PS Stuart Clark - já respondeu isso, então nenhum crédito para mim por favor. Porém, decidi reformular e postar como uma resposta separada, porque perdi a resposta dele, não ficou claro para mim quando li. descobri essa solução por acaso quando estava testando a fonte personalizada em um xib e vi que funcionava de forma programática em outro lugar, mas quando removi a fonte do xib, ela parou de funcionar de maneira programática.)

Wojtek
fonte
2

Atualizado para Swift 3.

let fontFamilies:[String] = UIFont.familyNames

for fontFamily: String in fontFamilies {
    let fontNames: [String] = UIFont.fontNames(forFamilyName: fontFamily)
    print("\(fontFamily)  \(fontNames)");
}
Gavin Williams
fonte
0

Talvez uma solução rápida - isso funcionou para mim quando a fonte já funcionava, mas um novo rótulo, por exemplo, não mostrava a fonte desejada:

pasta de dados derivados limpa, profundamente limpa e vazia.

raciocínio
fonte
0
please try below code.
@end
@implementation UILabel (CustomFont)
-(void)setFontName:(NSString *)value{
CGFloat newsize = (self.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self setFont:[UIFont fontWithName:self.font.fontName size:newsize]];
}
@end
@implementation UITextField (CustomFont)
-(void)setFontName:(NSString *)value{
CGFloat newsize = (self.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self setFont:[UIFont fontWithName:self.font.fontName size:newsize]];
}
@end
@implementation UIButton (CustomFont)
-(void)setFontName:(NSString *)value{
CGFloat newsize = (self.titleLabel.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self.titleLabel setFont:[UIFont fontWithName:self.titleLabel.font.fontName size:newsize]];
}
@end
@end

@interface UILabel (CustomFont)
-(void)setFontName:(NSString *)value;
@end
@interface UITextField (CustomFont)
-(void)setFontName:(NSString *)value;
@end
@interface UIButton (CustomFont)
-(void)setFontName:(NSString *)value;
@end
herry.master
fonte