Mam niestandardową czcionkę, której chcę używać do wszystkiego, co wyświetla tekst w mojej aplikacji, etykiety, widoki tekstu itp.
Czy istnieje sposób na ustawienie domyślnej czcionki (etykiety domyślnie używają czcionek SystemFont) dla całej aplikacji?
IBDesignable
dzisiejszych czasach. Mam nadzieję, że to pomoże.Odpowiedzi:
Wydaje się, że jest to możliwe w iOS 5 przy użyciu proxy UIAppearance.
Spowoduje to ustawienie czcionki na dowolną niestandardową czcionkę dla wszystkich etykiet UIL w Twojej aplikacji. Będziesz musiał powtórzyć to dla każdej kontrolki (UIButton, UILabel itp.).
Pamiętaj, że musisz umieścić wartość UIAppFonts w swoim info.plist i podać nazwę dołączonej czcionki.
źródło
setFont:
metoda jest przestarzałaUILabel
. Jest przestarzały,UIButton
ale używa czcionkititleLabel
zamiast aUILabel
, więc samo ustawienie czcionki z proxy wygląduUILabel
powinno wystarczyć.Szybki 5
Bazując na odpowiedzi Fábio Oliveiry ( https://stackoverflow.com/a/23042694/2082851 ), tworzę własny szybki 4.
W skrócie, to wymiana domyślne rozszerzenie funkcji
init(coder:)
,systemFont(ofSize:)
,boldSystemFont(ofSize:)
,italicSystemFont(ofSize:)
z moich metod niestandardowych.Zauważ, że nie jest w pełni zaimplementowany, ale możesz wymienić więcej metod na podstawie mojej implementacji.
źródło
if let fontAttribute = fontDescriptor.fontAttributes[.nsctFontUIUsage] as? String {
za mnie.UILabel
s, które ustawiają styl tekstu (pogrubienie, nagłówek, tytuł itp.) ... działa tylko z czcionkami o określonym rozmiarze i ustawionych czcionkach systemowych. @ nahung89Jest też inne rozwiązanie, które będzie polegało na nadpisaniu systemFont.
Po prostu utwórz kategorię
UIFont + SystemFontOverride.h
UIFont + SystemFontOverride.m
Spowoduje to zastąpienie domyślnej implementacji i większość kontrolek UIControl używa systemFont.
źródło
Jeśli używasz języka Swift, możesz utworzyć rozszerzenie UILabel:
A potem, gdzie robisz swój wygląd proxy:
Istnieje równoważny kod Objective-C używający
UI_APPEARANCE_SELECTOR
właściwości o nazwiesubstituteFontName
.Dodanie
W przypadku, gdy chcesz osobno ustawić pogrubione i zwykłe czcionki:
Następnie dla serwerów proxy UIAppearance:
Uwaga: jeśli stwierdzisz, że pogrubienie nie działa, możliwe, że domyślna nazwa czcionki nie zawiera słowa „Medium”. W razie potrzeby wyłącz ten ciąg na inny mecz (dzięki Masonowi w komentarzach poniżej).
źródło
UILabel
rozszerzenie tak, aby przyjmowało dodatkową nazwę czcionki dla pogrubienia. Następnieset
sprawdź, czy w nazwie czcionki jest „Pogrubiona” i zignoruj zestaw w jednym przypadku, a użyj go w drugim. Zmienię i dodam przykład.rangeOfString("Medium")
i zadziałało.Opracowując z odpowiedzi Hugues BR, ale używając swizzling metody, doszedłem do rozwiązania, które z powodzeniem zmienia wszystkie czcionki na żądaną czcionkę w mojej aplikacji.
Podejście z typem dynamicznym powinno być tym, czego powinieneś szukać w systemie iOS 7. Poniższe rozwiązanie nie używa typu dynamicznego.
Uwagi:
- initWithCoder:
nadpisania. Jednak to nie obejmie wszystkich przypadków;To rozwiązanie wykorzystuje dwie różne metody uzyskania efektu końcowego. Pierwszym jest nadpisanie metod klasy UIFont
+ systemFontWithSize:
i podobnych metodami używającymi moich alternatyw (tutaj używam "Zapfino", aby nie mieć wątpliwości, że zamiana się powiodła).Inną metodą jest zastąpienie
- initWithCoder:
metody w UIFont w celu zastąpienia dowolnego wystąpieniaCTFontRegularUsage
i podobnych przez moje alternatywy. Ta ostatnia metoda była konieczna, ponieważ odkryłem, żeUILabel
obiekty zakodowane w plikach NIB nie sprawdzają+ systemFontWithSize:
metod, aby uzyskać czcionkę systemową, a zamiast tego kodują je jakoUICTFontDescriptor
obiekty. Próbowałem to przesłonić,- awakeAfterUsingCoder:
ale w jakiś sposób było to wywoływane dla każdego zakodowanego obiektu w mojej planszy i powodowało awarie. Zastępowanie- awakeFromNib
nie pozwala mi odczytaćNSCoder
obiektu.źródło
UIAlertController
) nie zmieniają czcionki.Aby uzupełnić odpowiedź Sandy Chapman , oto rozwiązanie w Objective-C (umieść tę kategorię w dowolnym miejscu, w którym chcesz zmienić
UILabel
Appearance
):Plik interfejsu powinien mieć tę metodę zadeklarowaną publicznie do późniejszego użycia z miejsc takich jak delegat aplikacji:
Następnie możesz zmienić za
Appearance
pomocą:źródło
KOMENTARZ DLA SWIFT 3.0 I SWIFT WARNING
Możesz usunąć ostrzeżenie w linii:
Zamieniając go na:
źródło
Dla Swift 5
Wszystkie powyższe odpowiedzi są poprawne, ale zrobiłem to w trochę inny sposób, w zależności od rozmiaru urządzenia . Tutaj, w klasie ATFontManager, ustawiłem domyślny rozmiar czcionki, który jest zdefiniowany na górze klasy jako defaultFontSize , jest to rozmiar czcionki iphone plus i możesz go zmienić zgodnie z wymaganiami.
Dodałem nazwę czcionki, aby uzyskać więcej, możesz dodać nazwę czcionki i wpisać tutaj.
Ta klasa odnosi się do detektora urządzeń w celu zapewnienia odpowiedniego rozmiaru czcionki w zależności od urządzenia.
Jak używać. Mam nadzieję, że to pomoże.
źródło
Żadne z tych rozwiązań nie działa uniwersalnie w całej aplikacji. Jedną z rzeczy, które pomogły mi w zarządzaniu czcionkami w Xcode, jest otwarcie Storyboard jako kodu źródłowego (Control-click storyboard w nawigatorze plików> „Open as”> „Source”), a następnie wykonanie funkcji „znajdź i zamień”.
źródło
Typ czcionki zawsze należy ustawić w kodzie i końcówce / scenorysie.
Ponieważ kod, tak jak powiedział Hugues BR , zrób to w kategorii może rozwiązać problem.
W przypadku końcówki / storyboardu możemy metodą Swizzling awakeFromNib zmienić typ czcionki, ponieważ element interfejsu użytkownika z końcówki / serii ujęć zawsze wywołuje ją przed wyświetleniem na ekranie.
Przypuszczam, że znasz Aspects . To biblioteka do programowania AOP, oparta na Method Swizzling. Tworzymy kategorię dla UILabel, UIButton, UITextView, aby ją zaimplementować.
UILabel:
UIButton:
UITextField:
UITextView:
To wszystko, możesz zmienić HelveticaNeue-light na makro z nazwą swojej czcionki.
źródło
Stworzyłem własną konwersję typografii dla Swift 4 po przejrzeniu kilku postów, obejmuje ona większość przypadków, takich jak:
1. Dodaj czcionki do struktury projektu i do pliku .plist (o tej samej nazwie):
Następnie
Na koniec wywołaj utworzoną metodę
Appdelegate
jak dalej:źródło
Prawdopodobnie nie, prawdopodobnie sam ustawisz czcionkę na swojej kontrolce, ale możesz ułatwić ten proces, scentralizując miejsce, z którego pobierasz typy czcionek, na przykład delegat aplikacji lub inna wspólna klasa ma metodę, która zwraca czcionka i wszystko, co potrzebne do ustawienia czcionki, może wywołać tę metodę, co pomoże w przypadku konieczności zmiany czcionki, należy ją zmienić w jednym miejscu, a nie wszędzie tam, gdzie ustawisz czcionki ... Inną alternatywą może być utworzenie podklas elementy interfejsu użytkownika, które automatycznie ustawią czcionkę, ale może to być przesada.
źródło
NUI jest alternatywą dla proxy UIAppearance. Zapewnia kontrolę nad czcionką (i wieloma innymi atrybutami) dużej liczby typów elementów interfejsu użytkownika w całej aplikacji, po prostu modyfikując arkusz stylów, który można ponownie wykorzystać w wielu aplikacjach.
Po dodaniu
NUILabel
klasy do etykiet możesz łatwo kontrolować ich czcionkę w arkuszu stylów:Jeśli masz etykiety z różnymi rozmiarami czcionek, możesz kontrolować ich rozmiary za pomocą klas NUI Label, LargeLabel i SmallLabel, a nawet szybko utworzyć własne klasy.
źródło
Szybko używam tego typu klasy czcionek. Korzystanie z klasy rozszerzenia czcionki.
źródło
Dla Xamarin.iOS wewnątrz AppDelegate
FinishedLaunching()
umieścić kod w następujący sposób: -ustaw czcionkę dla całej aplikacji i dodaj
UIAppFonts
klawisz ' ' na Info.plist, ścieżka powinna być ścieżką, w której znajduje się plik czcionki .ttf, dla mnie był to folder 'fonts' w moim projekcie.źródło
Jak wspomniał @Randall,
UIApperance
proxy iOS 5.0+ można wykorzystać do dostosowania wyglądu wszystkich instancji klasy, czytaj więcej .Automatyczne uzupełnianie Xcodes nie pokazuje wszystkich dostępnych właściwości i może spowodować błąd, ale możesz go po prostu wpisać i skompilować.
źródło
Osiągnęliśmy to samo w Swift -Xcode 7.2 przy użyciu kontrolera widoku rodzica i kontrolera widoku dziecka (dziedziczenie).
Plik - Nowy - Klasa Cocoa Touch - ParentViewController.
Utwórz kontrolery widoku podrzędnego i skojarz je z StoryBoard VC, dodaj textLabel.
LUB Utwórz niestandardową klasę UILabel (metoda podklasy) i skojarz z nią wymagane etykiety.
Uwaga: Czcionka i kolor zadeklarowane w nadrzędnym VC są zaimplementowane w CustomFontLabel. Zaletą jest to, że możemy razem zmieniać właściwości uilabel / dowolnego widoku za pomocą kilku prostych zmian w Parent VC.
2) „for” zapętlający się UIView dla widoków podrzędnych. Działa tylko na określonym VC.
źródło