Alignement vertical des polices personnalisées UIButton

118

J'ai un UIButtonqui utilise une police personnalisée, qui est définie lorsque ma vue se charge:

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

Le problème que j'ai, c'est que la police semble flotter sur la ligne centrale. Si je commente cette ligne, la police par défaut apparaît bien centrée verticalement. Mais le passage à la police personnalisée rompt l'alignement vertical.

J'obtiens également le même problème sur une cellule de tableau avec une police personnalisée.

Dois-je indiquer à la vue quelque part que la police personnalisée n'est pas aussi haute que les autres polices?

EDIT: Je viens de réaliser que la police que j'utilise est une police Windows TrueType. Je peux l'utiliser correctement dans TextEdit sur Mac, seulement un problème d'alignement dans mon application

Le texte du bouton n'est pas centré verticalement

Pete
la source
J'ai le même problème avec cette police (.otf, pas .ttf): fontsquirrel.com/fonts/bebas-neue
Neal Ehardt

Réponses:

312

Un problème similaire a été discuté à La police installée personnalisée ne s'affiche pas correctement dans UILabel . Aucune solution n'a été donnée.

Voici la solution qui a fonctionné pour ma police personnalisée qui avait le même problème dans UILabel, UIButton et autres. Le problème avec la police s'est avéré être le fait que sa propriété ascendante était trop petite par rapport à la valeur des polices système. L'ascendeur est un espace blanc vertical au-dessus des caractères de la police. Pour réparer votre police, vous devrez télécharger les utilitaires de ligne de commande Apple Font Tool Suite . Ensuite, prenez votre police et procédez comme suit:

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

Cela créera Bold.hhea.xml. Ouvrez-le avec un éditeur de texte et augmentez la valeur de l' ascenderattribut. Vous devrez expérimenter un peu pour trouver la valeur exacte qui vous convient le mieux. Dans mon cas, je l'ai changé de 750 à 1200. Ensuite, exécutez à nouveau l'utilitaire avec la ligne de commande suivante pour fusionner vos modifications dans le fichier ttf:

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

Ensuite, utilisez simplement la police ttf résultante dans votre application.

OS X El Capitan

Le programme d'installation d'Apple Font Tool Suite ne fonctionne plus sur OSX El Capitan à cause de SIP car il tente d'installer les fichiers binaires dans un répertoire protégé. Vous devez extraire manuellement ftxdumperfuser. Copiez d'abord le pkg du dmg dans un répertoire local, puis décompressez le OS X Font Tools.pkgavec

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

Naviguez maintenant dans le dossier fontTools.pkgavec

~$ cd fontTools.pkg/

Extraire la charge utile avec

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

Maintenant, le ftxdumperfuserbinaire est dans votre dossier actuel. Vous pouvez le déplacer pour /usr/local/bin/pouvoir l'utiliser dans chaque dossier à l'intérieur de l'application de terminal avec les éléments suivants.

~$ mv ftxdumperfuser /usr/local/bin/
kolyuchiy
la source
4
+1 Bon conseil! Voici quelques informations sur les ascendeurs
tidwall
35
Fonctionne également bien pour les fichiers OTF.
mharper
2
Si vous utilisez une police personnalisée modifiée avec cette solution, et que vous définissez du texte, c'est-à-dire dans un UITextView avec plusieurs lignes, la distance interligne devient beaucoup trop grande.
Le mec le
5
J'ai constaté que dans iOS 7 beta 6, ils ont résolu le problème d'alignement des polices. Donc, si vous faites ce correctif, ce sera bien dans iOS 6, mais cassé dans iOS 7 .... 7 est toujours en version bêta, alors qui sait
tybro0103
3
Les outils de police ont été mis à jour pour Xcode 9, ils s'installent correctement sur High Sierra. Lien direct: developer.apple.com/download/more/?=font
Andrés Pizá Bückmann
49

J'ai résolu le problème en ajustant le contenu supérieur (pas le titre!).

Par exemple: button.contentEdgeInsets = UIEdgeInsetsMake (10.0, 0.0, 0.0, 0.0);

Bonne chance!

Jordi Corominas
la source
15
C'était une bonne solution rapide pour moi qui me semblait plus simple que d'essayer de modifier la police. myButton.titleLabel.font = [UIFont fontWithName: @ "FontName" taille: 20.0]; myButton.contentEdgeInsets = UIEdgeInsetsMake (3.0, 0.0, 0.0, 0.0);
Jamie Hamick
Brillant! Je vous remercie! Mon problème était légèrement différent, j'avais de simples boutons + et - utilisant la police par défaut et ils apparaissaient plus bas que centrés, j'ai pu utiliser la solution ici pour élever légèrement le texte afin qu'il ne paraisse pas.
Patrick T Nelson
7

Je ne sais pas si cela vous aidera car cela peut dépendre de votre police, mais il se peut que votre ligne de base soit mal alignée.

self.searchButton.titleLabel.baselineAdjustment = 
    UIBaselineAdjustmentAlignCenters;
Tapis
la source
3
Fonctionne très bien sur un titleLabel pour un UIButton lorsque la taille de la police est ajustée avec minimumScaleFactor
smitt04
2

Vous pouvez essayer cela dans Interface Builder. Voici un aperçu de la façon de le faire -

entrez la description de l'image ici entrez la description de l'image ici

Comme vous pouvez le voir, essayer de faire cela dans IB a ses propres avantages.

Srikar Appalaraju
la source
1
Ce paramètre est déjà en place, et dans IB, la police s'affiche verticalement, mais s'affiche comme police par défaut. Ce n'est que lorsque j'exécute mon application que ma police personnalisée apparaît, et elle n'est pas centrée verticalement
Pete
définissez-vous votre "police personnalisée" dans IB? est-il pris en charge dans les polices iOS?
Srikar Appalaraju le
La police est définie dans IB, ainsi que par le code spécifié dans mon message d'origine. Il n'apparaît pas réellement dans la maquette d'écran IB, bien qu'il le fasse dans la liste déroulante de sélection de police dans IB.
Pete
2

Tard à la fête, mais comme ce problème m'a frappé pour la Nième fois, j'ai pensé publier la solution la plus simple que j'ai trouvée: utiliser Python FontTools .

  1. Installez Python 3 s'il n'est pas disponible sur votre système.

  2. Installez FontTools

    pip3 install fonttools

    FontTools inclut un outil TTX qui permet la conversion vers et depuis XML.

  3. Convertissez votre police en .ttx dans le même dossier

    ttx myFontFile.otf

  4. Apportez les modifications nécessaires à .ttx et supprimez le fichier .otf car il sera remplacé à l'étape suivante.

  5. Reconvertissez le fichier en .otf

    ttx myFontFile.ttx


Motivation: La solution de kolyuchi est incomplète, et même avec ce flux d'installation étendu , l'exécution a ftxdumperfuserentraîné une erreur sur 10.15.2 Catalina.

NiFi
la source