Posso incorporar uma fonte personalizada em um aplicativo para iPhone?


772

Gostaria que um aplicativo incluísse uma fonte personalizada para renderizar texto, carregá-lo e depois usá-lo com UIKitelementos padrão como UILabel. Isso é possível?


5
Em um dos CS193p (iPhone Application Development) palestras em Stanford, Evan observou que a instalação de sua própria fonte em um dispositivo é “muito trabalho”, o que, pelo menos, significa que é possível :-)
Ilya Birman

2
iPhone 3.2 permite fonte personalizada, mas é apenas iPad (veja resposta abaixo)
samvermette

6
Eu usei imagens no final.
precisa saber é o seguinte

2
uau ... depois de tudo isso, a resposta ainda é imagens ... inacreditável. Eu realmente esperava uma implementação sólida de fontes personalizadas com o mesmo recurso das fontes do sistema. infelizmente ...
d2burke 17/09/12

1
Eu reduzi substancialmente a pergunta original para refletir a década que se passou desde que eu a fiz. Eu incentivaria todos os outros a apararem seus comentários e respostas adequadamente.
Airsource Ltd

Respostas:


646

O iOS 3.2 e versões posteriores suportam isso. Diretamente do documento O que há de novo no iPhone OS 3.2 :

Suporte a fontes personalizadas Os
aplicativos que desejam usar fontes personalizadas agora podem incluir essas fontes no pacote de aplicativos e registrá-las no sistema, incluindo a chave UIAppFonts no arquivo Info.plist. O valor dessa chave é uma matriz de cadeias identificando os arquivos de fonte no pacote configurável do aplicativo. Quando o sistema vê a chave, ele carrega as fontes especificadas e as disponibiliza para o aplicativo.

Depois que as fontes forem definidas Info.plist, você poderá usar suas fontes personalizadas como qualquer outra fonte no IB ou programaticamente.

Há um tópico em andamento nos Fóruns de desenvolvedores da Apple:
https://devforums.apple.com/thread/37824 (é necessário fazer login)

E aqui está um excelente e simples tutorial de 3 etapas sobre como conseguir isso (link quebrado removido)

  1. Adicione seus arquivos de fonte personalizados ao seu projeto usando o Xcode como um recurso
  2. Adicione uma chave ao seu Info.plistarquivo chamado UIAppFonts.
  3. Faça desta chave uma matriz
  4. Para cada fonte que você possui, digite o nome completo do seu arquivo de fonte (incluindo a extensão) como itens da UIAppFontsmatriz
  5. Salve  Info.plist
  6. Agora, no seu aplicativo, você pode simplesmente ligar [UIFont fontWithName:@"CustomFontName" size:12]para obter a fonte personalizada para usar com seus UILabels e UITextViews , etc.

Além disso: verifique se as fontes estão nos seus Recursos do pacote de cópias.


14
Aqui está um tutorial passo a passo para iOS4: blog.beefyapps.com/2010/06/custom-fonts-in-ios-4
pm_labs

15
Este tutorial é muito bom. shang-liang.com/blog/custom-fonts-in-ios4 Importante, o argumento NSString para [UIFont fontWithName: ...] é o nome do SO da fonte e não o nome do arquivo.
Willster

152
Antes que alguém gaste 3 horas instalando o fontforge para encontrar o nome real do postscript da fonte exigida pelo iOS. Vou salientar que você pode simplesmente pressionar Cmd + I na fonte no livro de fontes para encontrar essas informações.
Daniel Madeira

42
Depois de lutar para obter o nome da fonte correta, listei as fontes instaladas e a encontrei. Muito útil. Aqui está o código: for (NSString * familyName em [UIFont familyNames]) {NSLog (@ "Family% @", familyName); NSLog (@ "Names =% @", [UIFont fontNamesForFamilyName: familyName]); }
Steve Potter

26
Se o seu código não estiver funcionando, verifique se o arquivo de fonte foi encontrado em "Build Fhases" -> "Copy Bundle Resouces"
Mickey

299

Editar: a partir do iOS 3.2, essa funcionalidade é incorporada. Se você precisar oferecer suporte ao pré-3.2, ainda poderá usar esta solução.

Criei um módulo simples que estende UILabele manipula o carregamento de arquivos .ttf. Eu o liberei opensource sob a licença Apache e coloquei no github Here.

Os arquivos importantes são FontLabel.he FontLabel.m.

Ele usa parte do código da resposta de Genericrich .

Navegue pela fonte Aqui.

OU

  • Copie seu arquivo de fonte em recursos

  • Adicione uma chave ao seu Info.plistarquivo chamada UIAppFonts. ("Fontes fornecidas pelo aplicativo)

  • Faça desta chave uma matriz

  • Para cada fonte que você possui, digite o nome completo do seu arquivo de fonte (incluindo a extensão) como itens da matriz UIAppFonts

  • Salve  Info.plist

  • Agora, no seu aplicativo, você pode simplesmente ligar [UIFont fontWithName:@"CustomFontName" size:15]para obter a fonte personalizada para usar com o seu UILabelse UITextViews, etc.

Para maiores informações


2
Eu tentei usar seu código, mas ele trava muitas vezes, dependendo da fonte. Por exemplo, tente usar as fontes africanas ou Tiki aqui fontspace.com/category/tiki .
4thSpace

2
Esta biblioteca funciona muito bem. Preciso de ajuda com o espaçamento vertical. Não consigo descobrir como fazê-lo. Então, eu tenho esta mensagem.numberOfLines = 3; Como controle o espaçamento vertical entre a linha 1 e as linhas 2 e 3? Obrigado, Tee
teepusink 15/11/2009

2
Olá, commanda, o link que você forneceu na sua resposta parece não estar disponível.
precisa saber é o seguinte

5
@ParthBhatt Você deve usar a solução fornecida em stackoverflow.com/a/2616101/21447 em vez do FontLabel, pois essa funcionalidade agora é fornecida pelo CocoaTouch.
usar o seguinte comando

2
@ParthBhatt: Eu não sei por que o repo não está hospedado na Zynga, mas é disponível em github.com/kballard/fontlabel
Lily Ballard

116

Existe uma maneira simples de usar fontes personalizadas no iOS 4 .

  1. Adicione seu arquivo de fonte (por exemplo Chalkduster.ttf) à pasta Resources do projeto no XCode.
  2. Abra info.pliste adicione uma nova chave chamada UIAppFonts. O tipo dessa chave deve ser matriz.
  3. Adicione seu nome de fonte personalizado a esta matriz, incluindo a extensão ( Chalkduster.ttf).
  4. Agora você pode usar [UIFont fontWithName:@"Chalkduster" size:16]no seu aplicativo.

Infelizmente, o IB não permite inicializar rótulos com fontes personalizadas. Veja esta pergunta para resolver este problema. Minha solução favorita é usar UILabelsubclasse personalizada :

@implementation CustomFontLabel

- (id)initWithCoder:(NSCoder *)decoder
{
    if (self = [super initWithCoder: decoder])
    {
        [self setFont: [UIFont fontWithName: @"Chalkduster" size: self.font.pointSize]];
    }
    return self;
}

@end

3
Parece que isso é suportado no 3.2, não apenas no 4.0+
Jesse Rusak 19/10/10

1
Obrigado! O problema que estou enfrentando é que as fontes personalizadas parecem se inclinar um pouco mais (espaço extra abaixo) em relação às suas contrapartes internas. Tentei usar o repositório FontLabel do GitHub, que ajuda algumas vezes, mas não o tempo todo.
Joe D'Andrea

12
Vale a pena notar que a string que você passa para o construtor UIFont NÃO é o nome do arquivo menos a extensão é o nome interno da fonte. Ocorreu um problema ao carregar uma fonte com um nome de arquivo que reduzi. Quando usei o nome inteiro da fonte, contido no arquivo, a fonte foi carregada corretamente.
slayton

5
O que Slayton acabou de dizer é crítico. [UIFont fontWithName: espera o "Nome completo" da fonte, que é visível abrindo-o no Catálogo de fontes e selecionando: Visualizar -> Mostrar informações da fonte
electromaggot

51

No Info.plist, adicione a entrada "Fontes fornecidas pelo aplicativo" e inclua os nomes das fontes como strings:

Fonts provided by application
           Item 0        myfontname.ttf
           Item 1        myfontname-bold.ttf
           ...

Em seguida, verifique se a fonte está incluída executando:

for (NSString *familyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
         NSLog(@"%@", fontName);
    }
}

Observe que o nome do seu arquivo ttf pode não ser o mesmo que você usa quando define a fonte para sua etiqueta (você pode usar o código acima para obter o parâmetro "fontWithName"):

[label setFont:[UIFont fontWithName:@"MyFontName-Regular" size:18]];

36

editar: esta resposta está extinta a partir do iOS3.2; use UIAppFonts

A única maneira de conseguir carregar UIFonts personalizados com sucesso é através da estrutura privada GraphicsServices.

O seguinte carregará todas as .ttffontes no pacote principal do aplicativo:

BOOL GSFontAddFromFile(const char * path);
NSUInteger loadFonts()
{
    NSUInteger newFontCount = 0;
    for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
        newFontCount += GSFontAddFromFile([fontFile UTF8String]);
    return newFontCount;
}

Depois que as fontes são carregadas, elas podem ser usadas como as fontes fornecidas pela Apple:

NSLog(@"Available Font Families: %@", [UIFont familyNames]);
[label setFont:[UIFont fontWithName:@"Consolas" size:20.0f]];

O GraphicsServices pode até ser carregado em tempo de execução, caso a API desapareça no futuro:

#import <dlfcn.h>
NSUInteger loadFonts()
{
    NSUInteger newFontCount = 0;
    NSBundle *frameworkBundle = [NSBundle bundleWithIdentifier:@"com.apple.GraphicsServices"];
    const char *frameworkPath = [[frameworkBundle executablePath] UTF8String];
    if (frameworkPath) {
        void *graphicsServices = dlopen(frameworkPath, RTLD_NOLOAD | RTLD_LAZY);
        if (graphicsServices) {
            BOOL (*GSFontAddFromFile)(const char *) = dlsym(graphicsServices, "GSFontAddFromFile");
            if (GSFontAddFromFile)
                for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
                    newFontCount += GSFontAddFromFile([fontFile UTF8String]);
        }
    }
    return newFontCount;
}

nota para aqueles que querem saber, isso não funciona, mas você vai precisar chamar loadFonts direita antes de usar a fonte - eles não parecem ficar carregado em toda a aplicação
de pixel

No OS 3.0, você definitivamente precisa usar o segundo segundo exemplo, não esqueça a importação. Funcionou muito bem para mim.
1219 Ryan M.

Outra observação - essa é uma estrutura privada e a carrega dinamicamente ... e provavelmente interromperá a aceitação do seu aplicativo na AppStore.
pixel

Qual é a conclusão? Quais alternativas para esse método?
Raj Pawan Gumdal

1
Também deve observar que [NSString sizeWithFont:[UIFont fontWithName:@"customFont" size:14]];retorna 0 largura e altura para todas as fontes personalizadas que eu tentei.
Luke Mcneice

34

Com iOS 8+ e Xcode 6+ você pode fazer isso facilmente. Aqui estão os passos:

1) Arraste e solte sua fonte na Xcodepasta Arquivos de Suporte. Não esqueça de marcar seu aplicativo na seção Adicionar às metas . A partir deste momento, você pode usar essa fonte IBe selecioná-la no palete de fontes.

insira a descrição da imagem aqui

2) Para disponibilizar esta fonte no seu dispositivo, abra sua chave info.pliste adicione Fonts provided by application. Ele conterá a chave do item 0, você deve adicionar o nome da fonte como valor. O nome da fonte pode variar do seu nome de arquivo. Mas primeiro, tente adicionar seu nome de arquivo na maioria dos casos, este trabalho.

insira a descrição da imagem aqui

Caso contrário, este artigo sempre me ajudou.

Aqui está um trecho rápido do código deste artigo para ajudá-lo a encontrar o nome da fonte.

func allFonts(){

   for family in UIFont.familyNames(){

       println(family)


       for name in UIFont.fontNamesForFamilyName(family.description)
       {
           println("  \(name)")
       }

   }

}

EDITAR

Quero mencionar que você precisa adicionar arquivos de fonte às fases de compilação do seu destino , copiar recursos do pacote . Sem ele, você não verá sua fonte no dispositivo. E isso pode levar a um comportamento inesperado.

Por exemplo, encontro um bug, quando UITextFieldtenho uma fonte personalizada, mas essa fonte não estava nos Recursos do pacote de cópias . E quando eu passo para viewcontrollerisso textfield, há um atraso cerca de 4 segundos antes da viewDidLoadfunção ser chamada. A resolução de problemas de fonte removeu esse atraso. Portanto, recomende verificar duas vezes. (rdar: // 20028250) Aliás, não consegui reproduzir o bug, mas tenho certeza de que o problema estava com a fonte.


1
Apenas uma nota. As fontes personalizadas não estão disponíveis nas telas de inicialização, mesmo se configuradas corretamente no IB. O que pode ser lógico.
Rivera

@ Rivera uau, ótima nota! Não sabia disso. Alternativa possível é usar UIImage com texto, eu acho.
Dima Deplov

@ Rivera, obrigado por essa informação - ela está documentada em algum lugar? Eu estava subindo os degraus repetidamente, pensando que perdi um passo.
Spongessuck

@spongessuck não tenho certeza sobre sua pergunta, mas há alguns documentos developer.apple.com/library/ios/documentation/StringsTextFonts/…
Dima Deplov

27

Eu fiz isso assim:

Carregue a fonte:

- (void)loadFont{
  // Get the path to our custom font and create a data provider.
  NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"mycustomfont" ofType:@"ttf"]; 
  CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]);

  // Create the font with the data provider, then release the data provider.
  customFont = CGFontCreateWithDataProvider(fontDataProvider);
  CGDataProviderRelease(fontDataProvider); 
}

Agora, no seu drawRect:, faça algo parecido com isto:

-(void)drawRect:(CGRect)rect{
    [super drawRect:rect];
    // Get the context.
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, rect);
    // Set the customFont to be the font used to draw.
    CGContextSetFont(context, customFont);

    // Set how the context draws the font, what color, how big.
    CGContextSetTextDrawingMode(context, kCGTextFillStroke);
    CGContextSetFillColorWithColor(context, self.fontColor.CGColor);
    UIColor * strokeColor = [UIColor blackColor];
    CGContextSetStrokeColorWithColor(context, strokeColor.CGColor);
    CGContextSetFontSize(context, 48.0f);

    // Create an array of Glyph's the size of text that will be drawn.
    CGGlyph textToPrint[[self.theText length]];

    // Loop through the entire length of the text.
    for (int i = 0; i < [self.theText length]; ++i) {
        // Store each letter in a Glyph and subtract the MagicNumber to get appropriate value.
        textToPrint[i] = [[self.theText uppercaseString] characterAtIndex:i] + 3 - 32;
    }
    CGAffineTransform textTransform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
    CGContextSetTextMatrix(context, textTransform);
    CGContextShowGlyphsAtPoint(context, 20, 50, textToPrint, [self.theText length]);
}

Basicamente, você precisa fazer alguma força bruta percorrendo o texto e zerando com o número mágico para encontrar seu deslocamento (aqui, veja-me usando 29) na fonte, mas funciona.

Além disso, você deve garantir que a fonte seja legalmente incorporável. A maioria não é e existem advogados especializados nesse tipo de coisa, portanto, seja avisado.


1
Tenho certeza de que funciona bem, mas eu (realmente) não quero escrever meu próprio mecanismo de layout para lidar com tudo o que o UILabel e o UITextView atualmente fazem por mim - particularmente quebra de linha, posicionamento e edição.
Airsource Ltd

1
AFAICS, isso funciona apenas com caracteres maiúsculos, daí a chamada 'uppercaseString'.
Martin Cote

2
Estou com voto negativo, já que o truque "número mágico" é um truque puro que realmente não funciona. A solução real é obter a tabela cmap do arquivo TTF.
Martin Cote

1
Esta é uma informação interessante sobre o uso de fontes diretamente com o Core Graphics. Apenas para atualizar para futuros leitores: Nos sistemas operacionais mais novos, pode-se e deve-se usar o Core Text. Como alternativa, pode-se usar CGContextShowTextAtPoint()- embora não funcione com UTF-8.
Ivan Vučica

20

Sim, você pode incluir fontes personalizadas. Consulte a documentação do UIFont, especificamente, o fontWithName:size:método.

1) Certifique-se de incluir a fonte na sua pasta de recursos.

2) O "nome" da fonte não é necessariamente o nome do arquivo.

3) Verifique se você tem o direito legal de usar essa fonte. Ao incluí-lo no seu aplicativo, você também está distribuindo e precisa ter o direito de fazer isso.


Você realmente fez isso com sucesso? Não posso fazê-lo funcionar e o Google encontra apenas outras pessoas que tentaram e falharam.
Airsource Ltd

Sim. Eu tenho. Novamente, verifique se você está usando o nome da fonte apropriado.
agosto

1
Quando você diz "O" nome "da fonte não é necessariamente o nome do arquivo" ... como encontrar o nome correto?
1911 Keith Fitzgerald

7
Sim, esta resposta está errada. Você não pode fazer isso imediatamente.
Jonathan Sterling

iOS 9 atualização, docs UIFont não menciona nada sobre fontes personalizadas
ACB

20

Se você estiver usando xcode 4.3, será necessário adicionar fontao Build Phasesub Copy Bundle Resources, de acordo com https://stackoverflow.com/users/1292829/arne no segmento, Custom Fonts Xcode 4.3 . Isso funcionou para mim. Aqui estão as etapas que eu tomei para que fontes personalizadas funcionassem no meu aplicativo:

  1. Adicione a fonte ao seu projeto. Eu arrastei e soltei os arquivos OTF(ou TTF) para um novo grupo que criei e aceitei a opção de xcode copying the files over to the project folder.
  2. Crie a UIAppFontsmatriz com suas fontes listadas como itens dentro da matriz. Apenas a namesextensão, não a extensão (por exemplo, " GothamBold", " GothamBold-Italic").
  3. Clique no project namecaminho na parte superior do Project Navigatorlado esquerdo da tela.
  4. Clique na Build Phasesguia que aparece na área principal do xcode.
  5. Expanda a Copy Bundle Resourcesseção " " e clique em "+"para adicionar a fonte.
  6. Selecione o arquivo de fonte no navegador de arquivos que é aberto quando você clica no "+".
  7. Faça isso para cada fonte que você precisar add to the project.

12

Aqui estão as instruções passo a passo de como fazê-lo. Não há necessidade de biblioteca extra ou qualquer codificação especial.

http://shang-liang.com/blog/custom-fonts-in-ios4/

Na maioria das vezes o problema ocorre com a fonte e não com o método. A melhor maneira de fazer isso é usar uma fonte que com certeza funcione, como verdana ou geogia. Mude para a fonte pretendida. Se não funcionar, talvez o nome da fonte não esteja correto ou a fonte não esteja bem formatada.


12

É muito fácil adicionar uma nova fonte ao seu aplicativo iOS existente.

Você só precisa adicionar a fonte, por exemplo, font.ttf na sua Pasta de Recursos.

Abra seu aplicativo info.plist . Adicione uma nova linha como "Fontes fornecidas pelo aplicativo" e digite o nome da fonte como font.ttf.

E ao definir a fonte, faça o setFont:"corresponding Font Name"

Você pode verificar se sua fonte foi adicionada ou não por NSArray *check = [UIFont familyNames]; .

Ele retorna toda a fonte suportada pelo aplicativo.


11

Eu recomendaria seguir um dos meus tutoriais curtos favoritos aqui: http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/ a partir do qual essas informações vêm.

Etapa 1 - Arraste seu arquivo .ttf ou .otf do Finder para o seu projeto

NOTA - Clique na caixa para 'Adicionar aos destinos' no destino principal do aplicativo

Arraste os arquivos de fonte para o seu projeto e clique para adicioná-los ao seu destino

Se você esqueceu de clicar para adicioná-lo ao seu destino, clique no arquivo de fonte na hierarquia do projeto e, no painel direito, clique no alvo principal do aplicativo na seção Associação ao Destino

como adicionar fontes ao destino do aplicativo se você esqueceu

Para garantir que suas fontes façam parte do destino do seu aplicativo, verifique se elas são exibidas em Recursos do pacote de cópias em Fases de compilação

como verificar recursos para ver se as fontes fazem parte do destino do aplicativo

Etapa 2 - Adicione os nomes dos arquivos de fonte ao seu Plist

Vou ao Propriedades personalizadas do destino do iOS na sua seção Informações e adicione uma chave aos itens dessa seção chamados Fonts provided by application(você deve vê-la como uma opção à medida que a digita, e ela será configurada como uma matriz. Clique na pequena seta para abrir os itens da matriz e digite os nomes dos arquivos .ttf ou .otf que você adicionou para que seu aplicativo saiba que esses são os arquivos de fonte que você deseja disponibilizar

NOTA - Se o seu aplicativo falhar logo após esta etapa, verifique a ortografia nos itens adicionados aqui

exemplo plist com fontes personalizadas adicionadas

Etapa 3 - Descubra os nomes das suas fontes para poder chamá-las

Muitas vezes, o nome da fonte visto pelo seu aplicativo é diferente do que você acha que se baseia no nome do arquivo dessa fonte, insira isso no seu código e verifique o log que seu aplicativo faz para ver qual nome de fonte chamar no seu código

Rápido

for family: String in UIFont.familyNames(){
  print("\(family)")
  for names: String in UIFont.fontNamesForFamilyName(family){
      print("== \(names)")
  }
}

Objetivo C

for (NSString* family in [UIFont familyNames]){
    NSLog(@"%@", family);
    for (NSString* name in [UIFont fontNamesForFamilyName: family]){
        NSLog(@"  %@", name);
    }
}

Seu log deve ser algo como isto:

Exemplo de pesquisa de log para encontrar nomes de fontes

Etapa 4 - Use sua nova fonte personalizada usando o nome da Etapa 3

Rápido

 label.font = UIFont(name: "SourceSansPro-Regular", size: 18)

Objetivo C

 label.font = [UIFont fontWithName:@"SourceSansPro-Regular" size:18];

10

Encontre o TTF no localizador e em "Obter informações". Sob o título "Nome completo:", ele me deu um nome com o qual eu usei fontWithName(apenas copiei e colei o nome exato, neste caso, nenhuma extensão '.ttf' era necessária).


8

Ainda não saiu, mas a próxima versão do cocos2d (estrutura de jogos em 2D) suportará fontes de bitmap de comprimento variável como mapas de caracteres.

http://code.google.com/p/cocos2d-iphone/issues/detail?id=317

O autor não tem uma data de lançamento definida para esta versão, mas eu vi uma postagem que indicava que seria no próximo mês ou dois.


8

Um aviso importante: você deve usar o "nome PostScript" associado à fonte, não seu nome completo ou nome de família. Esse nome geralmente pode ser diferente do nome normal da fonte.


7

siga esta etapa

1) Copie sua fonte no seu projeto

2) abra seu .plistarquivo no modo de código-fonte ... (Nota - Não abra info.plist)

3) Antes disso - clique com o botão direito do mouse na sua fonte e abra-a no fontforge ou editor similar e install em seu sistema.install

4) Digite isso

 <key>UIAppFonts</key>
<array>
    <string>MyriadPro.otf</string>
</array>

5) Digite este código no seu class .m

 [lblPoints setFont:[UIFont fontWithName:@"Myriad Pro" size:15.0]];

Aqui os lblPoints serão alterados a partir do seu UILabel

Feito!! Se a fonte ainda não funcionar, verifique primeiro a compatibilidade da fonte


1
por que não abre info.plist?
Raptor

por que espaço entre Myraid e Pro no quinto ponto, quando não há nenhum no Plist no ponto 4?
jayant rawat 24/04

@jayantrawat O nome da fonte, que é mostrado no sistema após a instalação, e .plist é o nome do arquivo [.ttl ou otf]
Kirtikumar A.

@KirtikumarA. sim entendi .. implementado com sucesso no aplicativo ..
jayant rawat

@jayantrawat se minha solução ajudar, solicite que você dê votos positivos na resposta para que outros usuários possam ter ajuda da mesma maneira
Kirtikumar A.

6

Talvez o autor tenha esquecido de dar à fonte um nome MAC FOND ?

  1. Abra a fonte no FontForge e vá para Elemento> Informações da fonte
  2. Existe uma opção "Mac" onde você pode definir o nome FOND.
  3. Em Arquivo> Exportar fonte, você pode criar um novo ttf

Você também pode experimentar a opção "Apple" na caixa de diálogo de exportação.

AVISO LEGAL : Eu não sou um desenvolvedor de iPhone!


6

Venho testando as várias sugestões desta página no iOS 3.1.2 e estas são minhas conclusões:

Simplesmente usando [UIFont fontWithName:size:] com as fontes no diretório Resources não funcionará, mesmo que o nome FOND seja definido usando FontForge.

[UIFont fontWithName:size:]funcionará se as fontes forem carregadas primeiro usando GSFontAddFromFile. Mas GSFontAddFromFilenão faz parte do iOS 3.1.2, portanto, ele deve ser carregado dinamicamente, conforme descrito por @rpetrich.


5

Olho para cima ATSApplicationFontsPath

Uma entrada simples que permite incluir o (s) arquivo (s) de fonte na pasta de recursos do aplicativo e eles "simplesmente funcionam" no aplicativo.


Você já tentou isso no dispositivo? Eu não tinha alegria, e pesquisar no Google sugere que essa entrada não é suportada no iPhone, mesmo que esteja documentada para o iPhone OS.
Airsource Ltd

1
Desculpe, estou usando apenas em um aplicativo OS X no momento.
6115 Matt Sephton

5

Combinei alguns dos conselhos desta página em algo que funciona para mim no iOS 5.

Primeiro, você precisa adicionar a fonte personalizada ao seu projeto. Em seguida, você precisa seguir os conselhos do @iPhoneDev e adicionar a fonte ao seu arquivo info.plist.

Depois de fazer isso, isso funciona:

UIFont *yourCustomFont = [UIFont fontWithName:@"YOUR-CUSTOM-FONT-POSTSCRIPT-NAME" size:14.0];
[yourUILabel setFont:yourCustomFont];

No entanto, você precisa saber o nome do Postscript da sua fonte. Basta seguir o conselho de @Daniel Wood e pressionar command-i enquanto estiver no FontBook.

Em seguida, aproveite sua fonte personalizada.


5

Primeiro adicione a fonte no formato .odt aos seus recursos; nesse caso, usaremos DINEngschriftStd.otf e, em seguida, usar esse código para atribuir a fonte ao rótulo

[theUILabel setFont:[UIFont fontWithName:@"DINEngschriftStd" size:21]];

Para garantir que sua fonte seja carregada no projeto, basta ligar

NSLog(@"Available Font Families: %@", [UIFont familyNames]);

Na lista. Você deve declarar a fonte. Basta adicionar um registro 'Fontes fornecidas pelo aplicativo' e adicionar uma sequência de itens 0 com o nome da fonte (DINEngschriftStd.otf)


5

Para iOS 3.2 e superior: use os métodos fornecidos por vários acima, que são:

  1. Adicione seu arquivo de fonte (por exemplo, Chalkduster.ttf ) à pasta Recursos do projeto no XCode.
  2. Abra info.plist e adicione uma nova chave chamada UIAppFonts. O tipo dessa chave deve ser matriz.
  3. Adicione seu nome de fonte personalizado a esta matriz, incluindo a extensão (" Chalkduster.ttf ").
  4. Use [UIFont fontWithName:@"Real Font Name" size:16]no seu aplicativo.

MAS O "Nome real da fonte" nem sempre é o que você vê no Fontbook. A melhor maneira é perguntar ao seu dispositivo quais fontes ele vê e quais são os nomes exatos.

Eu uso o uifont-name-grabber postado em: uifont-name-grabber

Basta soltar as fontes que você deseja no projeto xcode, adicionar o nome do arquivo ao seu plist e executá-lo no dispositivo para o qual você está construindo; ele enviará por e-mail uma lista completa das fontes usando os nomes UIFont fontWithName:esperados.


5

Melhor solução é adicionar uma nova propriedade " Fonts provided by application" ao seu info.plistarquivo.

Em seguida, você pode usar sua fonte personalizada como normal UIFont.


3

Há uma nova maneira de usar fontes personalizadas, começando com o iOS 4.1. Ele permite que você carregue fontes dinamicamente, sejam de arquivos incluídos no aplicativo, de dados baixados ou do que você possui. Ele também permite carregar fontes conforme necessário, enquanto o método antigo carrega todas elas no momento da inicialização do aplicativo, o que pode levar muito tempo se você tiver muitas fontes.

O novo método é descrito em ios-dynamic-font-loading

Você usa a CTFontManagerRegisterGraphicsFontfunção, fornecendo um buffer com os dados da fonte. Em seguida, fica disponível para UIFontvisualizações da Web e da Web, assim como no método antigo. Aqui está o código de exemplo desse link:

NSData *inData = /* your font-file data */;
CFErrorRef error;
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)inData);
CGFontRef font = CGFontCreateWithDataProvider(provider);
if (! CTFontManagerRegisterGraphicsFont(font, &error)) {
    CFStringRef errorDescription = CFErrorCopyDescription(error)
    NSLog(@"Failed to load font: %@", errorDescription);
    CFRelease(errorDescription);
}
CFRelease(font);
CFRelease(provider);

Eu usei esse código, mas obtive o erro & Falha ao carregar a fonte: A operação não pôde ser concluída. (erro com.apple.coretext 105 - Não foi possível registrar o CGFont '<CGFont (0x14fe7df0): Shruti>')
Hiren

De acordo com a documentação, o erro 105 é kCTFontManagerErrorAlreadyRegistered: "O arquivo já foi registrado no escopo especificado". developer.apple.com/library/ios/#documentation/Carbon/Reference/…
David M.

3

Swift, code way: (funciona também com o swift 2.0)

Adicione as fontes necessárias ao seu projeto (assim como adicionar imagens, basta arrastar para o Xcode), verifique se elas estão direcionadas ao seu projeto.
Adicione este método e carregue fontes personalizadas (recomendado em appDelegate didFinishLaunchingWithOptions)

func loadFont(filePath: String) {

    let fontData = NSData(contentsOfFile: filePath)!

    let dataProvider = CGDataProviderCreateWithCFData(fontData)
    let cgFont = CGFontCreateWithDataProvider(dataProvider)!

    var error: Unmanaged<CFError>?
    if !CTFontManagerRegisterGraphicsFont(cgFont, &error) {
        let errorDescription: CFStringRef = CFErrorCopyDescription(error!.takeUnretainedValue())
        print("Unable to load font: %@", errorDescription, terminator: "")
    }

}

Use exemplo:

if let fontPath = NSBundle.mainBundle().pathForResource("My-Font", ofType: "ttf"){
      loadFont(fontPath)
}

Use a fonte:

UIFont(name: "My-Font", size: 16.5)

Imaginando, como é que você não adicionará a fonte no seu Info.plist parece muito mais trabalho essencialmente para a mesma coisa.
Stephen Jesse

2

Você pode adicionar os arquivos "FONT" necessários na pasta de recursos. Em seguida, vá para o Info.plistarquivo Projeto e use a CHAVE "Fontes fornecidas pelo aplicativo" e o valor como "NOME DA FONTE".

Então você pode chamar o método [UIFont fontwithName:@"FONT NAME" size:12];


1

Eu fiz todo o possível, mas as novas fontes não aparecem, então encontrei a solução:

Quando você arrasta os arquivos fot (otf ou ttf), NÃO marque a caixa de seleção em "Adicionar aos destinos".

Depois de fazer isso, sua fonte aparecerá e tudo funcionará bem.


1

Embora algumas das respostas acima estejam corretas, escrevi um tutorial visual detalhado para pessoas que ainda têm problemas com fontes.

As soluções acima que lhe dizem para adicionar a fonte ao plist e usar

[self.labelOutlet setFont:[UIFont fontWithName:@"Sathu" size:10]];

são os corretos. Por favor, use agora qualquer outra maneira hackeada. Se você ainda estiver com problemas para encontrar nomes de fontes e adicioná-los, aqui está o tutorial -

Usando fontes personalizadas no aplicativo ios


Eu apenas tentei isso. Parece funcionar, mas minha fonte é pequena, não importa o tamanho que eu a defina. Quanto vale a pena, estou usando um arquivo OTF disponível gratuitamente: philsfonts.com/index.php/free_fonts
ouro ari

Experimente com qualquer outra fonte personalizada e, se o problema persistir, entre em contato. Se funcionar dessa maneira, há um problema com sua fonte.
Bharat Gulati

1

sim, você pode usar fonte personalizada em seu aplicativo

passo a passo a seguir:

Adicione seus arquivos de fonte personalizados ao seu projeto em arquivos de suporte

Adicione uma chave ao seu arquivo Info.plist chamado UIAppFonts.

Faça desta chave uma matriz

Para cada fonte que você possui, digite o nome completo do seu arquivo de fonte (incluindo a extensão) como itens na matriz UIAppFonts

Salve Info.plist Agora, no seu aplicativo, você pode simplesmente chamar [UIFont fontWithName: @ "your Custom Font Name" tamanho: 20] para obter a fonte personalizada para usar com seus UILabels depois de aplicá-la, se você não obtiver a fonte correta, clique duas vezes na fonte personalizada e veja com atenção o nome da fonte do lado superior chegando e copie esta fonte, cole aqui [UIFont fontWithName: @ "aqui após o nome da fonte personalizada" tamanho: 20]

espero que você obtenha a resposta correta


1

sim, você pode usar fonte personalizada em seu aplicativo

passo a passo a seguir:

  • Adicione seus arquivos de fonte personalizados ao seu projeto em arquivos de suporte
  • Adicione uma chave ao seu Info.plist arquivo chamada UIAppFonts.
  • Faça desta chave uma matriz
  • Para cada fonte que você possui, digite o nome completo do seu arquivo de fonte (incluindo a extensão) como itens na matriz UIAppFonts
  • Economize Info.plist agora em seu aplicativo, você pode simplesmente ligar [UIFont fontWithName:@"your Custom font Name" size:20]para obter a fonte personalizada para usar com o seuUILabels

depois de aplicar isso, se você não estiver obtendo a fonte correta, clique duas vezes na fonte personalizada e veja cuidadosamente o nome da fonte do lado superior chegando e copie esta fonte e cole-a, cole, [UIFont fontWithName:@" here past your Custom font Name" size:20] espero que você obtenha a resposta correta

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.