Jak uzyskać nazwę czcionki z pliku otf lub ttf?

83

Użyłem niestandardowej czcionki w mojej poprzedniej aplikacji.

Nazwa pliku brzmiała „ProximaNova-Regular.otf” i aby załadować czcionkę, której właśnie użyłem ...

[UIFont fontWithName:@"ProximaNova-Regular" size:20];

To działało doskonale.

Teraz w tej nowej aplikacji mam trzy pliki czcionek ...

Dude_Willie.otf
Impact
handsean.ttf

Ale nie jestem pewien, jak je załadować.

próbowałem

[UIFont fontWithName:<the file name> size:20];

Ale to po prostu wraca do używania Helvetica.

Jak mogę znaleźć nazwę, której należy użyć?

Fogmeister
źródło
możliwy duplikat nazwy czcionki
niesystemowej
@FyodorVolchyok ah. Spójrz na komentarze. Już zignorowałem to pytanie. Problem, który miałem, polegał na tym, że nie zainstalowałem poprawnie czcionek w projekcie, więc wyświetlenie listy familyNamesnie zawierało czcionek, których szukałem.
Fogmeister
unix.stackexchange.com/q/26053/26227 - fc-scan --format "%{foundry}: %{family}\n" filename.ttflub filename.otf.
Dave Jarvis

Odpowiedzi:

89

Wykonaj cztery proste kroki, aby dodać i używać nowej czcionki w aplikacji na iOS:

  • Dodaj your_new_font.ttf lub your_new_font.otf do projektu Xcode
  • Na info.plist twojego projektu dodaj nowy wpis dla your_new_font.ttf lub your_new_font.otf do UIAppFontstablicy (zwykły tekst dla tego to „Czcionki dostarczone przez aplikację”)
  • W tym miejscu zalecam dodanie tej tymczasowej porcji kodu debugowania, aby zrzucić wszystkie czcionki dostępne w Twojej aplikacji, w tym nowo dodaną twoją_new_font:

//Szybki

    for family: String in UIFont.familyNames {
        print("\(family)")
        for names: String in UIFont.fontNames(forFamilyName: family) {
            print("== \(names)")
        }
    }

//Cel C

for(NSString *fontfamilyname in [UIFont familyNames]) {
    NSLog(@"family:'%@'",fontfamilyname);
    for(NSString *fontName in [UIFont fontNamesForFamilyName:fontfamilyname]) {
        NSLog(@"\tfont:'%@'",fontName);
    }
    NSLog(@"-------------");
}
  • W wynikach debugowania poszukaj „rodziny” i nazwy „czcionki” nowej czcionki. Przekaż wszystko, co jest wyświetlane jako nazwa `` czcionki '' odpowiadającej nowej rodzinie czcionek (może być więcej niż jedna czcionka powiązana z nową `` rodziną '' czcionek) UIFont *myNewFont = [UIFont fontWithName:@"font_name_from_debug_output" size:20]i powinieneś zacząć działać !
John Jacecko
źródło
124

Kliknij prawym przyciskiem myszy TTF -> Uzyskaj informacje

„Pełne imię i nazwisko” jest tym, czego szukasz.

To właśnie zadziałało w przypadku TTF.

Edytować:

Właśnie użyłem czcionki, która miała inną nazwę niż „Full Name” w sekcji Get Info.

Aby skompilować tę odpowiedź, jeśli powyższe szybkie sprawdzenie nie działa, uruchom ten kod w swoim projekcie:

for (NSString *fontFamilyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:fontFamilyName]) {
        NSLog(@"Family: %@    Font: %@", fontFamilyName, fontName);
    }
}

I wyszukaj poprawną nazwę czcionki, której chcesz użyć.

Kod Swift 3.0:

for fontFamilyName in UIFont.familyNames{
    for fontName in UIFont.fontNames(forFamilyName: fontFamilyName){
        print("Family: \(fontFamilyName)     Font: \(fontName)")
    }
}
Segev
źródło
To naprawdę zależy od producenta czcionki. Mieliśmy kilka okropnych czcionek, które otrzymaliśmy od klienta, a nazwy czcionek są poważnie arbitralne, gdy są używane przez iOS. Właśnie wypróbowałem tę metodę z jedną z naszych czcionek i się nie udało.
borrrden
@borrrden do tej pory ta metoda działała dla mnie za każdym razem. Nigdy sam nie stworzyłem czcionki, więc możesz mieć rację, nie wiem.
Segev
Najprawdopodobniej zadziała w przypadku dobrze wykonanych czcionek. Czcionki, które otrzymaliśmy, powstały około 20 lat temu (było źle ...). Jednak jedynym sposobem na upewnienie się jest zapytanie systemu.
borrrden
3
Dzięki, to zadziałało po prawidłowym zainstalowaniu czcionek w pliku info.plist.
Fogmeister
6
Nie działa to dla wszystkich czcionek. Na przykład wartość „Full Name” jest wyświetlana jako „Proxima Nova Regular”, gdy rodzina w kodzie to „ProximaNova-Regular”
rrbrambley
59
  • Zainstaluj czcionkę
  • Otwórz aplikację Album z czcionkami na komputerze Mac
  • Wybierz czcionkę i kliknij przycisk „Informacje”
  • Nazwa, której szukasz, to nazwa PostScript
    • MacOS: Widok -> Pokaż informacje o czcionce

przykład

Elin Gersin
źródło
5
wydaje się być najprostszym sposobem
Eyal Alsheich
8
fwiw, musiałem przejść Widok> Pokaż informacje o czcionce, aby zobaczyć szczegóły. Nie wiem, dlaczego było to domyślnie wyłączone na moim komputerze.
Mark Robson,
41

Aby używać czcionek w systemie iOS, należy załadować czcionkę w oparciu o PEŁNĄ NAZWĘ czcionki (nazwę PostScript), która czasami (i zwykle jest) inna niż rzeczywista NAZWA PLIKU czcionki .

Wyobraź sobie, że zmieniasz nazwę pliku czcionki „Arial-regular.ttf” na „foo.ttf”. Czcionka zawarta w zmienionym przed chwilą pliku czcionki to nadal „Arial-regular”.

Istnieje kilka dobrych programowych sposobów uzyskania nazwy czcionki już w tym wątku, ale mam inne podejście, używając wiersza poleceń.

Jeśli korzystasz z Maca lub Linuksa, po prostu uruchom ten skrypt z wiersza poleceń w katalogu, w którym masz własne czcionki ( użyjfc-scan narzędzia z fontconfig, które prawdopodobnie jest już zainstalowane, ale jeśli nie, możesz go zainstalować przez homebrew:) brew install fontconfig:

for file in "$arg"*.{ttf,otf}; do fc-scan --format "%{postscriptname}\n" $file; done

Oto zrzut ekranu powyższego polecenia działającego w moim ~/Library/Fontskatalogu:

wprowadź opis obrazu tutaj

Powyższy skrypt przejdzie przez wszystkie pliki .ttfi .otfw bieżącym katalogu, a następnie wydrukuje nazwę PostScript dla każdej czcionki, której możesz użyć do odniesienia się do pliku czcionki w XCode lub w innym miejscu.

Jeśli chcesz uzyskać dodatkowe informacje (PostScriptName, nazwa pliku) i trochę kodowania kolorami, możesz uruchomić ten alternatywny skrypt:

for file in "$arg"*.{ttf,otf}; do 
    postscriptname=$(fc-scan --format "%{postscriptname}\n" $file);
    printf "\033[36m PostScript Name:\033[0m %s \e[90m(%s)\033[0m\n" "$postscriptname" "$file";
done

wprowadź opis obrazu tutaj

Jest to nieco szybsze niż kopiowanie i wklejanie kodu wewnątrz pliku AppDelegate.m, aby wydrukować nazwy za każdym razem, gdy chcesz dodać nowy plik czcionki, co jest popularną metodą, a także jest szybsze niż otwieranie czcionki w FontBooku, aby sprawdź nazwę PostScript.

PRZYDATNA WSKAZÓWKA: Jeśli utworzysz alias powyższego skryptu w swoim terminalu, aby wszystko, co musisz zrobić, to wpisać jedno polecenie, aby uzyskać wszystkie nazwy czcionek PostScript dla wszystkich plików w bieżącym katalogu (moja funkcja nazywa się fontnameswięc wszystko, co muszę zrobić jest typemfontnames na terminalu wewnątrz katalogu z czcionkami, a nazwy PostScript zostaną wydrukowane automatycznie, dzięki czemu zaoszczędzisz czas w przepływie pracy i będziesz mieć ten poręczny skrypt gotowy do użycia, gdy go potrzebujesz.

Mam nadzieję że to pomoże!

radiowizualne
źródło
Używam Maca. Ściągnąłem fontConfig z podanego linku. Ale ma w sobie tak wiele plików. Jak go używać lub zainstalować fontConfig na moim komputerze Mac.
Sujay UN
@SujayUN Jeśli korzystasz z komputera Mac, możesz już mieć fc-scanzainstalowane narzędzie. Co się dzieje, gdy uruchamiasz fc-scan -Vterminal?
radiowizualny
3
Można również zainstalować Fontconfig poprzez homebrew : brew install fontconfig.
radiowizualny
Dostaję to, gdy uruchomiłem cmd -bash: fc-scan: polecenie nie znaleziono
Sujay UN
Ok, polecam instalację przez Homebrew, jeśli nie masz go zainstalowanego na swoim komputerze. Zobacz link do Homebrew i zainstaluj polecenie w moim komentarzu powyżej.
radiowizualny
6

Chcesz wiedzieć, jak uzyskać nazwę, idź do tego: -

  NSArray *familyNames = [[NSArray alloc] initWithArray:[UIFont familyNames]];

  for (NSInteger indFamily=0; indFamily<[familyNames count]; ++indFamily) 
  {
        NSLog(@"Family name: %@", [familyNames objectAtIndex:indFamily]);

        NSArray *fontNames = [[NSArray alloc] initWithArray:
              [UIFont fontNamesForFamilyName:[familyNames objectAtIndex:indFamily]]];

        for (NSInteger indFont=0; indFont<[fontNames count]; ++indFont) 
        {
              NSLog(@"    Font name: %@", [fontNames objectAtIndex:indFont]);
        }
  }

mam nadzieję, że ci to pomoże ...

Arpit Kulshrestha
źródło
6

Jeśli chcesz znaleźć nazwę czcionki dla danego pliku czcionki programowo:

import Foundation

func loadFontName(for file: URL) throws -> String {
    let data = try Data(contentsOf: file)

    guard let provider = CGDataProvider(data: data as CFData) else {
        throw Error("Could not create data provider")
    }

    guard let font = CGFont(provider) else {
        throw Error("Could not load font")
    }

    guard let name = font.postScriptName else {
        throw Error("Could not get font name from font file")
    }

    return name as String
}

W razie Errorpotrzeby zastąp własnymi przedmiotami do rzucania .

Robert
źródło
5

Swift 3.0

for familyName in UIFont.familyNames {
        for fontName in UIFont.fontNames(forFamilyName: familyName ) {
            print("\(familyName) : \(fontName)")
        }
    }

źródło
5

Rozwiązanie Swift 4.0+

    for fontFamilyName in UIFont.familyNames {
        print("family: \(fontFamilyName)\n")

        for fontName in UIFont.fontNames(forFamilyName: fontFamilyName) {
            print("font: \(fontName)")
        }
    }

Wyświetli:

rodzina: Apple SD Gothic Neo

czcionka: AppleSDGothicNeo-Thin

czcionka: AppleSDGothicNeo-Light

JaredH
źródło
4

Po dodaniu czcionek do projektu / aplikacji dodaj ten kod (prawdopodobnie tylko w metodzie didFinishLaunchingWithOptions delegata aplikacji), aby wydrukować wszystkie dostępne czcionki dla Twojej aplikacji. Na podstawie tej listy powinieneś być w stanie zidentyfikować czcionkę, której szukasz. Nie zapomnij usunąć niepotrzebnego kodu po.

for (NSString *fontFamilyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:fontFamilyName]) {
        NSLog(@"Family: %@    Font: %@", fontFamilyName, fontName);
    }
}
Oliver Pearmain
źródło
4

Możesz także użyć otfinfo --info arial.ttf, aby uzyskać nazwę z wiersza poleceń. Nazwa postscriptowa to ta, którą musisz przekazać do konstruktora UIFont.

Moritz
źródło
3

Swift 1.2:

    for familyName in UIFont.familyNames() {
        for fontName in UIFont.fontNamesForFamilyName(familyName as! String) {
            println("\(familyName) : \(fontName)")
        }
    }
Harry Ng
źródło
2

Kolejnym „szybkim, praktycznym” hackowaniem, które nie wymaga skanowania wszystkich domyślnych czcionek, które istnieją w emulatorze lub urządzeniu, jest użycie czcionki do czegoś w twoim storyboard. Następnie, jeśli edytujesz scenorys za pomocą edytora tekstu (otwórz jako source code), możesz zobaczyć czcionki używane z nazwami „wewnętrznymi”, jeśli szukasz tagu „customFonts”:

<customFonts key="customFonts">
    <array key="Linotype - AvenirNextLTPro-Bold.otf">
        <string>AvenirNextLTPro-Bold</string>
    </array>
    <array key="Linotype - AvenirNextLTPro-Regular.otf">
        <string>AvenirNextLTPro-Regular</string>
    </array>
    <array key="TradeGothicLTPro-BdCn20.otf">
        <string>TradeGothicLTPro-BdCn20</string>
    </array>
</customFonts>
Ogień kaolinowy
źródło
1

Log family Nazwy pliku czcionek, a następnie uzyskaj dostęp do czcionek:

// You can log all font family names suing **fontNamesForFamilyName**

NSLog(@" font name %@", [UIFont fontNamesForFamilyName:@"the file name"]);

Mam nadzieję, że ci to pomoże.

Nishant Tyagi
źródło
Wydaje się, że nie działa dla nas - jeśli nazwa pliku różni się od nazwy rodziny czcionek, nie powiedzie się
Blitz,
Powinieneś otrzymać nazwę czcionki w get info.
Nishant Tyagi
0

Lista nazw i rodzin czcionek dla macOS w Swift 4.1 :

NSFontManager.shared.availableFonts.map { print($0) }
NSFontManager.shared.availableFontFamilies.map { print($0) }
Ben Stahl
źródło
-2

Obsługiwany Swift 4.0

To jest tylko jeden kod linii do drukowania całej rodziny czcionek i nazw czcionek

override func viewDidLoad() {
    super.viewDidLoad()
    //Main line of code
    UIFont.familyNames.sorted().forEach({ print($0); UIFont.fontNames(forFamilyName: $0 as String).forEach({print($0)})})
}
NiravS
źródło
Przeczytaj pytanie.
Fogmeister
@Fogmeister Twoja zaakceptowana odpowiedź jest taka sama, dlatego piszę ten kod w krótszy sposób ..
NiravS
Ta linia odczytuje plik ttf lub otf, a następnie podaje rodzinę czcionek i wszystkie nazwy czcionek. @Fogmeister
NiravS
Jeśli zaakceptowana odpowiedź jest taka sama jak twoja ... dlaczego piszesz tę? Po prostu edytuj ten, który już istnieje (do tego służy przycisk edycji). Nie próbuj kraść punktów reputacji innych osób, kopiując wklejanie ich odpowiedzi w przypadku drobnych, nieznaczących zmian. Teraz zmieniłem zaakceptowane pytanie na nowsze, które pokazuje, jak prawidłowo zainstalować czcionki. Dzięki
Fogmeister
Twoja odpowiedź brzmi „tylko jedna linia kodu”, ale jest prawie nieczytelna. Wolałbym odpowiedź składającą się z wielu wierszy, które można łatwo przeskanować, aby zobaczyć, co robi.
Fogmeister,