Wyrównanie w pionie niestandardowej czcionki UIButton


118

Mam, UIButtonktóry używa niestandardowej czcionki, która jest ustawiana, gdy mój widok się ładuje:

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

Problem polega na tym, że czcionka wydaje się unosić w górę z linii środkowej. Jeśli wykomentuję tę linię, domyślna czcionka jest dobrze wyśrodkowana w pionie. Jednak zmiana na czcionkę niestandardową przerywa wyrównanie w pionie.

Ten sam problem występuje również w przypadku komórki tabeli z niestandardową czcionką.

Czy muszę gdzieś powiedzieć widokowi, że czcionka niestandardowa nie jest tak wysoka, jak inne czcionki?

EDYCJA: Właśnie zdałem sobie sprawę, że czcionka, której używam, to czcionka Windows TrueType. Mogę go dobrze używać w TextEdit na Macu, tylko problem z wyrównaniem w mojej aplikacji

Tekst przycisku nie jest wyśrodkowany w pionie


Mam ten sam problem z tą czcionką (.otf, nie .ttf): fontsquirrel.com/fonts/bebas-neue
Neal Ehardt

Odpowiedzi:


312

Podobny problem został omówiony w sekcji Niestandardowa zainstalowana czcionka, która nie jest poprawnie wyświetlana w UILabel . Nie podano rozwiązania.

Oto rozwiązanie, które zadziałało dla mojej niestandardowej czcionki, która miała ten sam problem w UILabel, UIButton i tym podobnych. Problem z czcionką polegał na tym, że jej właściwość wznosząca była zbyt mała w porównaniu z wartością czcionek systemowych. Ascender to pionowa spacja nad znakami czcionki. Aby naprawić czcionkę, musisz pobrać narzędzia wiersza poleceń Apple Font Tool Suite . Następnie weź czcionkę i wykonaj następujące czynności:

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

To stworzy Bold.hhea.xml. Otwórz go w edytorze tekstu i zwiększ wartość ascenderatrybutu. Będziesz musiał trochę poeksperymentować, aby znaleźć dokładną wartość, która będzie dla Ciebie najlepsza. W moim przypadku zmieniłem go z 750 na 1200. Następnie uruchom narzędzie ponownie, używając następującego wiersza poleceń, aby scalić zmiany z powrotem w pliku ttf:

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

Następnie po prostu użyj powstałej czcionki ttf w swojej aplikacji.

OS X El Capitan

Instalator Apple Font Tool Suite nie działa już w systemie OSX El Capitan z powodu SIP, ponieważ próbuje zainstalować pliki binarne w chronionym katalogu. Musisz ręcznie wyodrębnić ftxdumperfuser. Pierwsza kopia PKG z DMG do katalogu lokalnego potem Rozpakuj OS X Font Tools.pkgz

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

Teraz przejdź do folderu za fontTools.pkgpomocą

~$ cd fontTools.pkg/

Wyodrębnij ładunek za pomocą

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

Teraz ftxdumperfuserplik binarny znajduje się w Twoim bieżącym folderze. Możesz go przenieść do /usr/local/bin/, aby móc go używać w każdym folderze w aplikacji terminala, wykonując następujące czynności.

~$ mv ftxdumperfuser /usr/local/bin/

4
+1 Świetna wskazówka! Oto kilka informacji o Ascenders and Descenders typophile.com/node/13081
tidwall,

35
Działa równie dobrze w przypadku plików OTF.
mharper

2
Jeśli używasz niestandardowej czcionki zmodyfikowanej tym rozwiązaniem i ustawisz tekst, np. W UITextView z wieloma wierszami, odległość między wierszami stanie się zbyt duża.
Koleś

5
Odkryłem, że w iOS 7 beta 6 naprawili problem z wyrównaniem czcionek. Więc jeśli zrobisz tę poprawkę, będzie dobrze w iOS 6, ale zepsuta w iOS 7 .... 7 jest nadal w wersji beta, więc kto wie
tybro0103

3
Narzędzia czcionek zostały zaktualizowane dla Xcode 9, instalują się dobrze na High Sierra. Bezpośredni link: developer.apple.com/download/more/?=font
Andrés Pizá Bückmann

49

Rozwiązałem problem dopasowując górną zawartość (nie tytuł!) Wstawkę.

Na przykład: button.contentEdgeInsets = UIEdgeInsetsMake (10,0, 0,0, 0,0, 0,0);

Powodzenia!


15
To było dla mnie dobre, szybkie rozwiązanie, które wydawało się prostsze niż próba edycji czcionki. myButton.titleLabel.font = [UIFont fontWithName: @ "FontName" rozmiar: 20.0]; myButton.contentEdgeInsets = UIEdgeInsetsMake (3,0, 0,0, 0,0, 0,0);
Jamie Hamick

Znakomity! Dziękuję Ci! Mój problem był nieco inny, miałem proste przyciski + i - z domyślną czcionką i wyglądały niżej niż wyśrodkowane, mogłem użyć rozwiązania tutaj, aby nieco podnieść tekst, aby nie wyglądał na niego.
Patrick T Nelson

7

Nie jestem pewien, czy to pomoże, ponieważ może to zależeć od czcionki, ale może to oznaczać, że linia bazowa jest źle wyrównana.

self.searchButton.titleLabel.baselineAdjustment = 
    UIBaselineAdjustmentAlignCenters;

3
Działa świetnie z tytułem Etykieta dla UIButton, gdy rozmiar czcionki jest dostosowywany za pomocą minimumScaleFactor
smitt04


2

Możesz to wypróbować w programie Interface Builder. Oto migawka, jak to zrobić -

wprowadź opis obrazu tutaj wprowadź opis obrazu tutaj

Jak widać, próba zrobienia tego w IB ma swoje zalety.


1
To ustawienie już istnieje, aw IB czcionka jest wyświetlana pionowo, ale jest wyświetlana jako czcionka domyślna. Dopiero po uruchomieniu aplikacji pojawia się moja niestandardowa czcionka, która nie jest wyśrodkowana w pionie
Pete,

czy ustawiasz swoją „niestandardową czcionkę” w IB? czy jest obsługiwany w czcionkach iOS?
Srikar Appalaraju

Czcionka jest ustawiona w IB, a także kodem podanym w moim oryginalnym poście. W rzeczywistości nie pojawia się na makiecie ekranu IB, chociaż pojawia się na liście rozwijanej wyboru czcionki w IB.
Pete

2

Spóźniłem się na imprezę, ale ponieważ ten problem dotarł do mnie po raz n-ty, pomyślałem, że opublikuję najprostsze rozwiązanie, jakie znalazłem: użycie Python FontTools .

  1. Zainstaluj Python 3, jeśli nie jest dostępny w twoim systemie.

  2. Zainstaluj FontTools

    pip3 install fonttools

    FontTools zawiera narzędzie TTX, które umożliwia konwersję do iz XML.

  3. Przekonwertuj swoją czcionkę na .ttx w tym samym folderze

    ttx myFontFile.otf

  4. Dokonaj niezbędnych zmian w .ttx i usuń plik .otf, ponieważ zostanie on zastąpiony w następnym kroku.

  5. Przekonwertuj plik z powrotem na .otf

    ttx myFontFile.ttx


Motywacja: rozwiązanie przez kolyuchi jest niekompletna, a nawet z tej rozszerzonej przepływu instalacji , prowadzenie ftxdumperfuserspowodowało błędu 10.15.2 Catalina.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.