Próbuję użyć czcionki Helvetica Neue Condensed, którą otrzymałem z pakietu Adobe Font Collection Pro. Niestety wydaje się, że rysuje nieprawidłowo, gdy używam go w ramach UILabel
.
Wydaje się, że wysokość linii jest obliczona poprawnie (tak mi się wydaje), ale kiedy czcionka jest wyświetlana, jest wyrównana do samej góry obwiedni. Zadzwoniłem [myLabel sizeToFit]
i dostosowałem tylko szerokość, aby wykonać ten zrzut ekranu:
Miałem ten sam problem zarówno z pogrubioną, jak i zwykłą wersją czcionki. Udało mi się pobrać wersję Helvetica Neue Bold z OSX i umieścić ją na moim urządzeniu i wyświetla się dobrze (zielone tło na powyższym obrazku).
Co może być nie tak z plikiem czcionki lub moim kodem, co mogłoby spowodować, że rysuje się w ten sposób?
Odpowiedzi:
Opublikowałem rozwiązanie polegające na łataniu pliku czcionki ttf tutaj :
Oto rozwiązanie, które dział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śćascender
atrybutu. 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.
źródło
Więc to jest zmodyfikowana wersja odpowiedzi kolyuchiy .
Otworzyłem swoją czcionkę za pomocą Glyphs , a następnie wyeksportowałem ją bez modyfikowania czegokolwiek. W jakiś magiczny sposób zniknął problem z wyrównaniem w pionie!
Co lepsze, nowa czcionka ładnie współgra z metodami takimi jak
sizeWithFont:
, więc nie ma problemów, o których wspomniał Joshua .Rzuciłem okiem na tabelę HHEA z poleceniem wspomnianym przez kolyuchiy i zauważyłem, że Glyphs modyfikowały nie tylko
ascender
, ale takżelineGap
inumberOfHMetrics
dla mnie.Oto nieprzetworzone dane, wcześniej:
versionMajor="1" versionMinor="0" ascender="780" descender="-220" lineGap="200" advanceWidthMax="1371" minLeftSideBearing="-73" minRightSideBearing="-52" xMaxExtent="1343" caretSlopeRise="1" caretSlopeRun="0" caretOffset="0" metricDataFormat="0" numberOfHMetrics="751"
i po:
versionMajor="1" versionMinor="0" ascender="980" descender="-220" lineGap="0" advanceWidthMax="1371" minLeftSideBearing="-73" minRightSideBearing="-52" xMaxExtent="1343" caretSlopeRise="1" caretSlopeRun="0" caretOffset="0" metricDataFormat="0" numberOfHMetrics="748"
A więc morał tej historii - nie tylko zwiększaj wznoszącą się, ale także modyfikuj inne powiązane wartości.
Nie jestem ekspertem w dziedzinie typografii, więc nie potrafię wyjaśnić, dlaczego i jak. Byłoby bardzo wdzięczne, gdyby ktokolwiek mógł podać lepsze wyjaśnienie! :)
źródło
iOS 6 honoruje właściwość lineGap czcionki, podczas gdy iOS 7 ignoruje ją. Dlatego tylko niestandardowe czcionki z odstępem między wierszami równym 0 będą działać poprawnie w obu systemach operacyjnych.
Rozwiązaniem jest uczynienie lineGap 0 i odpowiednio powiększenie wyciągarki. Zgodnie z powyższą odpowiedzią , jednym z rozwiązań jest importowanie i eksportowanie z Glifów. Należy jednak pamiętać, że przyszła wersja aplikacji może naprawić ten „błąd”.
Bardziej niezawodnym rozwiązaniem jest samodzielna edycja czcionki, zgodnie z tym postem . Konkretnie,
ftxdumperfuser -t hhea -A d YOUR_FONT.ttf
ascender
właściwość, dodając do niej wartośćlineGap
właściwości. Na przykład, jeślilineGap
wynosi 200, aascender
wynosi 750, zróbascender
950.lineGap
0.ftxdumperfuser -t hhea -A f YOUR_FONT.ttf
Gdy to zrobisz, może być konieczne odpowiednie dostosowanie interfejsu użytkownika.
źródło
Mieliśmy ten sam problem z jedną z naszych niestandardowych czcionek. Rozwiązaliśmy również problem, edytując właściwość wznoszenia czcionki. Okazało się jednak, że spowodowało to inne problemy i problemy z układem. Na przykład dynamiczne ustawienie wysokości komórki na podstawie wysokości etykiety wydałoby się w górę, gdy użyjemy naszej edytowanej czcionki rosnącej.
Ostatecznie zmieniliśmy właściwość contentEdgetInsets UIButton.
yourButton.contentEdgeInsets = UIEdgeInsetsMake(-10, 0, 0, 0);
Nie jestem pewien, która metoda jest lepsza, ale po prostu chciałem udostępnić inny sposób rozwiązania problemu.
źródło
źródło
Dla tych, którzy używają OS X El Capitan i przychodzą do tego wątku, mogliście zauważyć, że Apple Font Tool Suite nie jest już kompatybilny (przynajmniej na razie).
Ale nadal możesz wprowadzić zmiany opisane przez kolyuchiy i Josepha Lina za pomocą bezpłatnego oprogramowania do edycji czcionek FontForge .
Otwórz czcionkę za pomocą FontForge i wybierz Element w górnym menu, a następnie przejdź do Informacje o czcionce> OS / 2> Metryki. Tam chcesz edytować wartości HHEad Line Gap i HHead Ascent Offset.
Po dokonaniu niezbędnych zmian możesz po prostu wyeksportować czcionkę w Plik> Generuj czcionki i wybrać odpowiedni format czcionki
źródło
Dzięki tej odpowiedzi rozwiązałem swój problem z Glifami, ale trochę inaczej.
Otworzyłem swoją czcionkę za pomocą Glyphs (działa również z Glyphs mini) i znalazłem tam tę sekcję (ta z Glyphs mini, aby się tam dostać, naciśnij przycisk i w prawym górnym rogu):
Po prostu usuń wszystkie te strefy wyrównania (lub niektóre z nich), a to naprawi ten problem. U mnie zadziałało idealnie.
źródło
Tworzenie przypisanego tekstu z tekstu etykiet było dla mnie rozwiązaniem. Oto rozszerzenie:
extension UILabel { /// You can call with or without param values; without will use default 2.0 func setLineSpacing(lineSpacing: CGFloat = 2.0, lineHeightMultiple: CGFloat = 2.0) { guard let labelText = self.text else { return } let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = lineSpacing paragraphStyle.lineHeightMultiple = lineHeightMultiple let attributedString:NSMutableAttributedString if let labelattributedText = self.attributedText { attributedString = NSMutableAttributedString(attributedString: labelattributedText) } else { attributedString = NSMutableAttributedString(string: labelText) } // (Swift 4.2 and above) Line spacing attribute attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length)) self.attributedText = attributedString } }
W przypadku mojej niestandardowej czcionki otrzymałem wynik, którego potrzebuję z:
self.myLabel.setLineSpacing(lineSpacing: 1.2, lineHeightMultiple: 1.2)
Działa to przy użyciu dostarczonego natywnego,
NSMutableParagraphStyle()
który zawiera właściwości wysokości linii i odstępów (które są również dostępne jako@IBOutlet
właściwości w Storyboard, jeśli nie programujesz etykiet).źródło
Czy próbowałeś już Core Text ? Odniosłem pewne sukcesy podczas renderowania niestandardowych czcionek za pomocą Core Text, ale nie wiem, czy pasowałoby to do Twojej sytuacji.
źródło
Użyłem https://github.com/fonttools/fonttools - bardzo łatwy w użyciu i darmowy. W moim przypadku zmiana „ascender” = 1000 i „lineGap” = 0 w tabeli „hhea” załatwiła sprawę.
Na podstawie artykułu Trevora Harmon https://medium.com/@thetrevorharmon/how-to-use-apples-font-tools-to-tweak-a-font-a386600255ae
źródło
Jeśli masz problemy z tymi narzędziami wiersza poleceń, wypróbuj fontcreator w oknie. i zmień czcionkę w menu ustawień.
źródło
Dla każdego, kto ma problemy z używaniem
ftxdumperfuser
( odpowiedź kolyuchiy ) w systemie Mac OS Mojave z powodu błędu polecenia nie znaleziono:export PATH="$PATH:$HOME/font-tools/FontCommandLineTools.pkg/Payload"
) lub skopiować narzędzia do folderu bin.źródło
Miałem podobny problem z kultową czcionką „FontAwesome” w mojej grze Sprite Kit. Ustawienie właściwości SKLabelNode SKLabelVerticalAlignmentMode na .Center zadziałało dla mnie.
myLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Center
Chciałem się tylko podzielić na wypadek, gdyby ktoś zmagał się z tym samym problemem.
źródło