UIButton alinhamento vertical de fonte personalizada

118

Eu tenho um UIButtonque usa uma fonte personalizada, que é definida quando minha visualização é carregada:

- (void)viewDidLoad
{
    [super viewDidLoad];    
    self.searchButton.titleLabel.font = [UIFont fontWithName: @"FONTNAME" size: 15.0 ];
}

O problema que tenho é que a fonte parece flutuar acima da linha central. Se eu comentar esta linha, a fonte padrão aparecerá bem centralizada verticalmente. Mas mudar para a fonte personalizada quebra o alinhamento vertical.

Estou tendo o mesmo problema em uma célula de tabela com uma fonte personalizada também.

Preciso informar à visualização em algum lugar que a fonte personalizada não é tão alta quanto as outras fontes?

EDIT: Acabei de perceber que a fonte que estou usando é uma fonte TrueType do Windows. Posso usá-lo bem no TextEdit no Mac, apenas um problema com o alinhamento do meu aplicativo

Texto do botão não centralizado verticalmente

Pete
fonte
Estou tendo o mesmo problema com esta fonte (.otf, não .ttf): fontsquirrel.com/fonts/bebas-neue
Neal Ehardt

Respostas:

312

Um problema semelhante foi discutido em Fonte instalada personalizada não exibida corretamente no UILabel . Não houve solução dada.

Aqui está a solução que funcionou para minha fonte personalizada que tinha o mesmo problema em UILabel, UIButton e outros. O problema com a fonte acabou sendo o fato de que sua propriedade ascender era muito pequena em comparação com o valor das fontes do sistema. Ascender é um espaço em branco vertical acima dos caracteres da fonte. Para corrigir sua fonte, você terá que baixar os utilitários de linha de comando do Apple Font Tool Suite . Em seguida, pegue sua fonte e faça o seguinte:

~$ ftxdumperfuser -t hhea -A d Bold.ttf

Isso vai criar Bold.hhea.xml. Abra-o com um editor de texto e aumente o valor do ascenderatributo. Você terá que experimentar um pouco para descobrir o valor exato que funciona melhor para você. No meu caso, mudei de 750 para 1200. Em seguida, execute o utilitário novamente com a seguinte linha de comando para mesclar suas alterações de volta no arquivo ttf:

~$ ftxdumperfuser -t hhea -A f Bold.ttf

Em seguida, basta usar a fonte ttf resultante em seu aplicativo.

OS X El Capitan

O Apple Font Tool Suite Installer não funciona mais no OSX El Capitan por causa do SIP porque ele tenta instalar os arquivos binários em um diretório protegido. Você tem que extrair manualmente ftxdumperfuser. Primeiro copie o pacote do dmg para um diretório local, depois descompacte o OS X Font Tools.pkgcom

~$ xar -xf OS\ X\ Font\ Tools.pkg

Agora navegue para a pasta fontTools.pkgcom

~$ cd fontTools.pkg/

Extraia carga útil com

~$ cat Payload | gunzip -dc | cpio -i

Agora o ftxdumperfuserbinário está em sua pasta atual. Você pode movê-lo para /usr/local/bin/para que possa usá-lo em todas as pastas dentro do aplicativo de terminal com o seguinte.

~$ mv ftxdumperfuser /usr/local/bin/
kolyuchiy
fonte
4
+1 Ótima dica! Aqui estão algumas informações sobre Ascenders e Descenders typophile.com/node/13081
tidwall
35
Funcionou igualmente bem para arquivos OTF.
marper
2
Se você usar uma fonte personalizada modificada com esta solução, e definir o texto, ou seja, em um UITextView com várias linhas, a distância entre linhas se torna muito grande.
O cara de
5
Descobri que no iOS 7 beta 6, eles corrigiram o problema de alinhamento de fontes. Então, se você fizer esta correção, será bom no iOS 6, mas quebrado no iOS 7 .... 7 ainda está em beta, então quem sabe
tybro0103
3
As ferramentas de fontes foram atualizadas para o Xcode 9 e instalam bem no High Sierra. Link direto: developer.apple.com/download/more/?=font
Andrés Pizá Bückmann
49

Resolvi o problema ajustando a inserção do conteúdo principal (não o título!).

Por exemplo: button.contentEdgeInsets = UIEdgeInsetsMake (10.0, 0.0, 0.0, 0.0);

Boa sorte!

Jordi Corominas
fonte
15
Esta foi uma boa solução rápida para mim que parecia mais simples do que tentar editar a fonte. myButton.titleLabel.font = [UIFont fontWithName: @ "FontName" size: 20.0]; myButton.contentEdgeInsets = UIEdgeInsetsMake (3.0, 0.0, 0.0, 0.0);
Jamie Hamick
Brilhante! Obrigado! Meu problema era um pouco diferente, eu tinha botões + e - simples usando a fonte padrão e eles pareciam mais baixos do que centralizados, consegui usar a solução aqui para aumentar um pouco o texto para que não parecesse estranho.
Patrick T Nelson
7

Não tenho certeza se isso vai ajudar, pois pode depender da sua fonte, mas pode ser que sua linha de base esteja desalinhada.

self.searchButton.titleLabel.baselineAdjustment = 
    UIBaselineAdjustmentAlignCenters;
Esteiras
fonte
3
Funciona muito bem em um titleLabel para um UIButton quando o tamanho da fonte está sendo ajustado com minimumScaleFactor
smitt04
2

Você pode tentar isso no Interface Builder. Aqui está um resumo de como fazer isso -

insira a descrição da imagem aqui insira a descrição da imagem aqui

Como você pode ver, tentar fazer isso no IB tem seus próprios benefícios.

Srikar Appalaraju
fonte
1
Essa configuração já está definida e no IB a fonte é exibida verticalmente, mas é exibida como a fonte padrão. É apenas quando eu executo meu aplicativo que minha fonte personalizada aparece, e não está centralizada verticalmente
Pete
você define sua "fonte personalizada" no IB? é compatível com fontes iOS?
Srikar Appalaraju
A fonte é definida em IB, e também pelo código especificado na minha postagem original. Na verdade, não aparece na maquete de tela do IB, embora apareça na lista suspensa de seleção de fonte no IB.
Pete
2

Atrasado para a festa, mas como esse problema me atingiu pela enésima vez, pensei em postar a solução mais simples que encontrei: usando Python FontTools .

  1. Instale o Python 3 se não estiver disponível em seu sistema.

  2. Instale FontTools

    pip3 install fonttools

    FontTools inclui uma ferramenta TTX que permite a conversão de e para XML.

  3. Converta sua fonte para .ttx na mesma pasta

    ttx myFontFile.otf

  4. Faça as edições necessárias em .ttx e exclua o arquivo .otf, pois ele será substituído na próxima etapa.

  5. Converta o arquivo de volta para .otf

    ttx myFontFile.ttx


Motivação: A solução de kolyuchi está incompleta e, mesmo com esse fluxo de instalação estendido , a execução ftxdumperfuserresultou em um erro no 10.15.2 Catalina.

NiFi
fonte