Gostaria que um aplicativo incluísse uma fonte personalizada para renderizar texto, carregá-lo e depois usá-lo com UIKit
elementos padrão como UILabel
. Isso é possível?
Gostaria que um aplicativo incluísse uma fonte personalizada para renderizar texto, carregá-lo e depois usá-lo com UIKit
elementos padrão como UILabel
. Isso é possível?
Respostas:
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)
Info.plist
arquivo chamado UIAppFonts
.UIAppFonts
matrizInfo.plist
[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.
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 UILabel
e 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.h
e 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.plist
arquivo 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 UILabels
e UITextViews
, etc.
Existe uma maneira simples de usar fontes personalizadas no iOS 4 .
Chalkduster.ttf
) à pasta Resources do projeto no XCode.info.plist
e adicione uma nova chave chamada UIAppFonts
. O tipo dessa chave deve ser matriz.Chalkduster.ttf
).[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 UILabel
subclasse personalizada :
@implementation CustomFontLabel
- (id)initWithCoder:(NSCoder *)decoder
{
if (self = [super initWithCoder: decoder])
{
[self setFont: [UIFont fontWithName: @"Chalkduster" size: self.font.pointSize]];
}
return self;
}
@end
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]];
editar: esta resposta está extinta a partir do iOS3.2; use UIAppFonts
A única maneira de conseguir carregar UIFont
s personalizados com sucesso é através da estrutura privada GraphicsServices.
O seguinte carregará todas as .ttf
fontes 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;
}
[NSString sizeWithFont:[UIFont fontWithName:@"customFont" size:14]];
retorna 0 largura e altura para todas as fontes personalizadas que eu tentei.
Com iOS 8
+ e Xcode 6
+ você pode fazer isso facilmente. Aqui estão os passos:
1) Arraste e solte sua fonte na Xcode
pasta 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 IB
e selecioná-la no palete de fontes.
2) Para disponibilizar esta fonte no seu dispositivo, abra sua chave info.plist
e 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.
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)")
}
}
}
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 UITextField
tenho uma fonte personalizada, mas essa fonte não estava nos Recursos do pacote de cópias . E quando eu passo para viewcontroller
isso textfield
, há um atraso cerca de 4 segundos antes da viewDidLoad
funçã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.
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.
CGContextShowTextAtPoint()
- embora não funcione com UTF-8.
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.
Se você estiver usando xcode 4.3
, será necessário adicionar font
ao Build Phase
sub 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:
OTF
(ou TTF
) para um novo grupo que criei e aceitei a opção de xcode copying the files over to the project folder
.UIAppFonts
matriz com suas fontes listadas como itens dentro da matriz. Apenas a names
extensão, não a extensão (por exemplo, " GothamBold
", " GothamBold-Italic
").project name
caminho na parte superior do Project Navigator
lado esquerdo da tela.Build Phases
guia que aparece na área principal do xcode.Copy Bundle Resources
seção " " e clique em "+"
para adicionar a fonte."+"
.add to the project
.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.
É 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.
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
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
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
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
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:
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];
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.
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.
siga esta etapa
1) Copie sua fonte no seu projeto
2) abra seu .plist
arquivo 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
info.plist
?
Talvez o autor tenha esquecido de dar à fonte um nome MAC FOND ?
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!
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 GSFontAddFromFile
não faz parte do iOS 3.1.2, portanto, ele deve ser carregado dinamicamente, conforme descrito por @rpetrich.
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.
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.
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)
Para iOS 3.2 e superior: use os métodos fornecidos por vários acima, que são:
[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.
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 CTFontManagerRegisterGraphicsFont
função, fornecendo um buffer com os dados da fonte. Em seguida, fica disponível para UIFont
visualizaçõ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);
kCTFontManagerErrorAlreadyRegistered
: "O arquivo já foi registrado no escopo especificado". developer.apple.com/library/ios/#documentation/Carbon/Reference/…
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)
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 -
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
sim, você pode usar fonte personalizada em seu aplicativo
passo a passo a seguir:
Info.plist
arquivo chamada UIAppFonts.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