Czy mogę osadzić niestandardową czcionkę w aplikacji na iPhone'a?

772

Chciałbym, aby aplikacja zawierała niestandardową czcionkę do renderowania tekstu, ładowała go, a następnie używała ze standardowymi UIKitelementami, takimi jak UILabel. czy to możliwe?

Airsource Ltd
źródło
5
W jednym z wykładów CS193p (iPhone Application Development) w Stanford Evan zauważył, że zainstalowanie własnej czcionki na urządzeniu to „dużo pracy”, co najmniej oznacza, że ​​jest to możliwe :-)
Ilya Birman
2
iPhone 3.2 zezwala na niestandardową czcionkę, ale jest to tylko iPad (patrz odpowiedź poniżej)
samvermette,
6
W końcu użyłem zdjęć.
Airsource Ltd,
2
wow ... po tym wszystkim odpowiedzią są wciąż obrazy ... niewiarygodne. Naprawdę liczyłem na solidną implementację niestandardowych czcionek o takich samych możliwościach jak czcionki systemowe. niestety ...
d2burke,
1
Zasadniczo skróciłem pierwotne pytanie, aby odzwierciedlić dziesięciolecie, które minęło od jego zadania. Zachęcam wszystkich innych do odpowiedniego przycinania komentarzy i odpowiedzi.
Airsource Ltd,

Odpowiedzi:

646

Obsługują to iOS 3.2 i nowsze. Prosto z dokumentu Co nowego w iPhone OS 3.2 :

Obsługa niestandardowych czcionek
Aplikacje, które chcą używać czcionek niestandardowych, mogą teraz umieszczać te czcionki w pakiecie aplikacji i rejestrować te czcionki w systemie, włączając klucz UIAppFonts w pliku Info.plist. Wartością tego klucza jest tablica ciągów znaków identyfikujących pliki czcionek w pakiecie aplikacji. Gdy system zobaczy klucz, ładuje określone czcionki i udostępnia je aplikacji.

Po ustawieniu czcionek w Info.plist, możesz używać własnych czcionek jak każdej innej czcionki w IB lub programowo.

Na forach programistów Apple jest ciągły wątek:
https://devforums.apple.com/thread/37824 (wymagane logowanie)

Oto doskonały i prosty 3-krokowy samouczek, jak to osiągnąć (usunięto uszkodzony link)

  1. Dodaj niestandardowe pliki czcionek do projektu, używając Xcode jako zasobu
  2. Dodaj klucz do Info.plistpliku o nazwie UIAppFonts.
  3. Uczyń ten klucz tablicą
  4. Dla każdej posiadanej czcionki wprowadź pełną nazwę pliku czcionki (w tym rozszerzenie) jako elementy UIAppFontstablicy
  5. Zapisać Info.plist
  6. Teraz w aplikacji możesz po prostu zadzwonić, [UIFont fontWithName:@"CustomFontName" size:12]aby uzyskać niestandardową czcionkę do użycia z UILabels i UITextViews itp.

Ponadto: upewnij się, że czcionki znajdują się w zasobach pakietu kopii.

samvermette
źródło
14
Oto samouczek krok po kroku dla iOS4: blog.beefyapps.com/2010/06/custom-fonts-in-ios-4
pm_labs
15
Ten samouczek jest bardzo dobry. shang-liang.com/blog/custom-fonts-in-ios4 Co ważne, argument NSString dla [UIFont fontWithName: ...] jest nazwą systemu operacyjnego dla czcionki, a nie nazwą pliku.
Willster
152
Zanim ktokolwiek spędzi 3 godziny na instalacji fontforge, aby znaleźć rzeczywistą nazwę czcionki wymaganą przez iOS. Zaznaczę, że możesz po prostu nacisnąć Cmd + I na czcionce w książce czcionek, aby znaleźć te informacje.
Daniel Wood
42
Po tym, jak starałem się uzyskać właściwą nazwę czcionki, właśnie wymieniłem zainstalowane czcionki i znalazłem ją. Bardzo pomocny. Oto kod: for (NSString * familyName w [UIFont familyNames]) {NSLog (@ „Family% @”, familyName); NSLog (@ "Names =% @", [UIFont fontNamesForFamilyName: familyName]); }
Steve Potter
26
Jeśli kod nie działa, upewnij się, że plik czcionki jest wyświetlany w „Fazach kompilacji” -> „Kopiuj zasoby pakietu”
Mickey,
299

Edycja: Począwszy od iOS 3.2, ta funkcja jest wbudowana. Jeśli potrzebujesz obsługiwać wersję wcześniejszą niż 3.2, możesz nadal korzystać z tego rozwiązania.

Stworzyłem prosty moduł, który rozszerza UILabeli obsługuje ładowanie plików .ttf. Wydałem to opensource na licencji Apache i umieściłem na github tutaj.

Ważnymi plikami są FontLabel.hi FontLabel.m.

Wykorzystuje część kodu z odpowiedzi Genericricha .

Przeglądaj źródło tutaj.

LUB

  • Skopiuj plik czcionek do zasobów

  • Dodaj klucz do Info.plistpliku o nazwie UIAppFonts. („Czcionki dostarczane przez aplikację)

  • Uczyń ten klucz tablicą

  • Dla każdej posiadanej czcionki wprowadź pełną nazwę pliku czcionki (w tym rozszerzenie) jako elementy tablicy UIAppFonts

  • Zapisać Info.plist

  • Teraz w aplikacji można po prostu zadzwonić [UIFont fontWithName:@"CustomFontName" size:15], aby uzyskać niestandardowe czcionki używać z UILabelsi UITextViews, etc ...

Po więcej informacji

komanda
źródło
2
Próbowałem użyć twojego kodu, ale często zawiesza się w zależności od czcionki. Na przykład spróbuj użyć czcionek afrykańskich lub Tiki z tutaj fontspace.com/category/tiki .
4thSpace
2
Ta biblioteka działa świetnie. Potrzebuję jednak pomocy z pionowymi odstępami. Nie mogę wymyślić, jak to zrobić. Mam więc ten komunikat. NumerOfLines = 3; Jak kontrolować pionowe odstępy między linią 1, a linią 2 i linią 3? Dziękuję, Tee
teepusink
2
@commanda Witaj komando, link podany w odpowiedzi wydaje się niedostępny.
Parth Bhatt
5
@ParthBhatt Zamiast FontLabel należy skorzystać z rozwiązania podanego na stackoverflow.com/a/2616101/21447 , ponieważ ta funkcja jest obecnie udostępniana przez CocoaTouch.
komanda
2
@ParthBhatt: Nie wiem, dlaczego repo nie jest już hostowane w zynga, ale jest dostępne na stronie github.com/kballard/fontlabel
Lily Ballard
116

Istnieje prosty sposób używania niestandardowych czcionek w systemie iOS 4 .

  1. Dodaj plik czcionki (na przykład Chalkduster.ttf) do folderu Zasoby projektu w XCode.
  2. Otwórz info.plisti dodaj nowy klucz o nazwie UIAppFonts. Typem tego klucza powinna być tablica.
  3. Dodaj niestandardową nazwę czcionki do tej tablicy, w tym extension ( Chalkduster.ttf).
  4. Teraz możesz używać [UIFont fontWithName:@"Chalkduster" size:16]w swojej aplikacji.

Niestety IB nie pozwala na inicjowanie etykiet niestandardowymi czcionkami. Zobacz to pytanie, aby rozwiązać ten problem. Moim ulubionym rozwiązaniem jest użycie niestandardowej UILabelpodklasy:

@implementation CustomFontLabel

- (id)initWithCoder:(NSCoder *)decoder
{
    if (self = [super initWithCoder: decoder])
    {
        [self setFont: [UIFont fontWithName: @"Chalkduster" size: self.font.pointSize]];
    }
    return self;
}

@end
Alexey
źródło
3
Wydaje się, że jest to obsługiwane z powrotem do wersji 3.2, a nie tylko 4.0+
Jesse Rusak
1
Dzięki! Problemem jest to, że niestandardowe czcionki wydają się nieco pochylać (dodatkowe miejsce poniżej) w porównaniu do ich wbudowanych odpowiedników. Próbowałem użyć repozytorium FontLabel firmy GitHub, które pomaga przez pewien czas, ale nie przez cały czas.
Joe D'Andrea
12
Warto zauważyć, że ciąg znaków przekazywany do konstruktora UIFont NIE jest nazwą pliku minus rozszerzenie jego wewnętrzną nazwą czcionki. Miałem problemy z ładowaniem czcionki o skróconej nazwie pliku. Gdy użyłem całej nazwy czcionki zawartej w pliku, czcionka została załadowana poprawnie.
slayton
5
To, co właśnie powiedział slayton, ma kluczowe znaczenie. [UIFont fontWithName: oczekuje „pełnej nazwy” czcionki, która jest widoczna po otwarciu jej w Książce czcionek i wybraniu: Podgląd -> Pokaż informacje o czcionce
elektromaggot
51

W Info.plist dodaj wpis „Czcionki dostarczone przez aplikację” i dołącz nazwy czcionek jako ciągi znaków:

Fonts provided by application
           Item 0        myfontname.ttf
           Item 1        myfontname-bold.ttf
           ...

Następnie sprawdź, czy Twoja czcionka jest uwzględniona, uruchamiając:

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

Pamiętaj, że nazwa pliku ttf może nie być tą samą nazwą, której używasz podczas ustawiania czcionki dla swojej etykiety (możesz użyć powyższego kodu, aby uzyskać parametr „fontWithName”):

[label setFont:[UIFont fontWithName:@"MyFontName-Regular" size:18]];
bdev
źródło
36

edycja: Ta odpowiedź jest nieaktualna od iOS3.2; użyj UIAppFonts

Jedynym sposobem, w jaki udało mi się pomyślnie załadować niestandardowe UIFonts, jest prywatna platforma GraphicsServices.

Następujące załaduje wszystkie .ttfczcionki w głównym pakiecie aplikacji:

BOOL GSFontAddFromFile(const char * path);
NSUInteger loadFonts()
{
    NSUInteger newFontCount = 0;
    for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
        newFontCount += GSFontAddFromFile([fontFile UTF8String]);
    return newFontCount;
}

Po załadowaniu czcionek można ich używać tak samo, jak czcionek dostarczonych przez Apple:

NSLog(@"Available Font Families: %@", [UIFont familyNames]);
[label setFont:[UIFont fontWithName:@"Consolas" size:20.0f]];

GraphicsServices można nawet załadować w czasie wykonywania na wypadek, gdyby interfejs API zniknął w przyszłości:

#import <dlfcn.h>
NSUInteger loadFonts()
{
    NSUInteger newFontCount = 0;
    NSBundle *frameworkBundle = [NSBundle bundleWithIdentifier:@"com.apple.GraphicsServices"];
    const char *frameworkPath = [[frameworkBundle executablePath] UTF8String];
    if (frameworkPath) {
        void *graphicsServices = dlopen(frameworkPath, RTLD_NOLOAD | RTLD_LAZY);
        if (graphicsServices) {
            BOOL (*GSFontAddFromFile)(const char *) = dlsym(graphicsServices, "GSFontAddFromFile");
            if (GSFontAddFromFile)
                for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
                    newFontCount += GSFontAddFromFile([fontFile UTF8String]);
        }
    }
    return newFontCount;
}
rpetrich
źródło
Uwaga dla tych, którzy zastanawiają się, to działa, ale musisz wywołać loadFonts tuż przed użyciem czcionki - nie wydają się być ładowane w całej aplikacji
piksel
W OS 3.0 zdecydowanie musisz użyć drugiego drugiego przykładu, nie zapomnij o imporcie. Działało mi całkiem nieźle.
M. Ryan,
Kolejna uwaga - jest to prywatna platforma i dynamicznie ją ładuje ... obie z nich prawdopodobnie zatrzymają akceptację twojej aplikacji w AppStore.
piksel
Jaki jest wniosek? Jakie alternatywy dla tej metody?
Raj Pawan Gumdal
1
Należy również zauważyć, że [NSString sizeWithFont:[UIFont fontWithName:@"customFont" size:14]];zwraca 0 szerokości i wysokości dla wszystkich niestandardowych czcionek, które próbowałem.
Luke Mcneice 17.01.11
34

Za pomocą iOS 8+ i Xcode 6+ możesz to łatwo zrobić. Oto kroki:

1) Przeciągnij i upuść czcionkę w Xcodefolderze Obsługa plików. Nie zapomnij zaznaczyć swojej aplikacji w sekcji Dodaj do celów . Od tego momentu możesz używać tej czcionki IBi wybierać ją z palety czcionek.

wprowadź opis zdjęcia tutaj

2) Aby udostępnić tę czcionkę w urządzeniu, otwórz info.plisti dodaj Fonts provided by applicationklucz. Będzie on zawierał klucz pozycji 0, musisz dodać nazwę czcionki jako wartość. Nazwa czcionki może różnić się od nazwy pliku czcionki. Ale najpierw spróbuj dodać swoją nazwę pliku w większości przypadków, to działa.

wprowadź opis zdjęcia tutaj

Jeśli nie, ten artykuł zawsze mi pomógł.

Oto krótki fragment kodu z tego artykułu, który pomaga znaleźć nazwę czcionki.

func allFonts(){

   for family in UIFont.familyNames(){

       println(family)


       for name in UIFont.fontNamesForFamilyName(family.description)
       {
           println("  \(name)")
       }

   }

}

EDYTOWAĆ

Chcę wspomnieć, że musisz dodać pliki czcionek do faz kompilacji celu , skopiuj zasoby pakietu . Bez tego nie zobaczysz swojej czcionki na urządzeniu. I może to prowadzić do nieoczekiwanego zachowania.

Na przykład napotkałem bug, gdy UITextFieldmam niestandardową czcionkę, ale tej czcionki nie było w zasobach pakietu kopii . A kiedy przechodzę do viewcontrollertego textfield, jest opóźnienie około 4 sekund przed viewDidLoadwywołaniem funkcji. Rozwiązywanie problemów z czcionkami usunęło to opóźnienie. Dlatego zalecamy sprawdzenie go dwa razy. (rdar: // 20028250) Przy okazji nie udało mi się odtworzyć błędu, ale jestem pewien, że problem dotyczył czcionki.

Dima Depłow
źródło
1
Tylko uwaga. Niestandardowe czcionki nie są dostępne w LaunchScreens, nawet jeśli są poprawnie skonfigurowane w IB. Co może być logiką.
Rivera
@Rivera wow, świetna uwaga! Nie wiedziałem tego. Myślę, że możliwą alternatywą jest użycie UIImage z tekstem.
Dima Depłow
@Rivera, dzięki za te informacje - czy jest to gdzieś udokumentowane? Kilkakrotnie przechodziłem po schodach, myśląc, że przegapiłem krok.
spongessuck
@spongessuck nie jestem pewien co do twojego pytania, ale jest kilka dokumentów developer.apple.com/library/ios/documentation/StringsTextFonts/...
Dima Deplov
27

Zrobiłem to tak:

Załaduj czcionkę:

- (void)loadFont{
  // Get the path to our custom font and create a data provider.
  NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"mycustomfont" ofType:@"ttf"]; 
  CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]);

  // Create the font with the data provider, then release the data provider.
  customFont = CGFontCreateWithDataProvider(fontDataProvider);
  CGDataProviderRelease(fontDataProvider); 
}

Teraz drawRect:zrób coś takiego:

-(void)drawRect:(CGRect)rect{
    [super drawRect:rect];
    // Get the context.
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, rect);
    // Set the customFont to be the font used to draw.
    CGContextSetFont(context, customFont);

    // Set how the context draws the font, what color, how big.
    CGContextSetTextDrawingMode(context, kCGTextFillStroke);
    CGContextSetFillColorWithColor(context, self.fontColor.CGColor);
    UIColor * strokeColor = [UIColor blackColor];
    CGContextSetStrokeColorWithColor(context, strokeColor.CGColor);
    CGContextSetFontSize(context, 48.0f);

    // Create an array of Glyph's the size of text that will be drawn.
    CGGlyph textToPrint[[self.theText length]];

    // Loop through the entire length of the text.
    for (int i = 0; i < [self.theText length]; ++i) {
        // Store each letter in a Glyph and subtract the MagicNumber to get appropriate value.
        textToPrint[i] = [[self.theText uppercaseString] characterAtIndex:i] + 3 - 32;
    }
    CGAffineTransform textTransform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
    CGContextSetTextMatrix(context, textTransform);
    CGContextShowGlyphsAtPoint(context, 20, 50, textToPrint, [self.theText length]);
}

Zasadniczo musisz wykonać brutalną pętlę przez tekst i błąkać się z magiczną liczbą, aby znaleźć przesunięcie (tutaj, zobacz mnie za pomocą 29) w czcionce, ale to działa.

Musisz także upewnić się, że czcionka jest prawnie osadzalna. Większość z nich nie ma i są prawnicy specjalizujący się w tego rodzaju sprawach, więc ostrzegajcie.

Genericrich
źródło
1
Jestem pewien, że to działa dobrze, ale (naprawdę naprawdę) nie chcę pisać własnego silnika układu, aby obsłużyć wszystko, co UILabel i UITextView obecnie dla mnie robią - zwłaszcza zawijanie, pozycjonowanie i edytowanie słów.
Airsource Ltd,
1
AFAICS, działa to tylko z wielkimi literami, stąd wywołanie „uppercaseString”.
Martin Cote,
2
Oddaję głos, ponieważ sztuczka „magiczna liczba” to czysty hack, który tak naprawdę nie działa. Prawdziwym rozwiązaniem jest pobranie tabeli cmap z pliku TTF.
Martin Cote,
1
Jest to fajna informacja na temat używania czcionek bezpośrednio w Core Graphics. Aby zaktualizować dla przyszłych czytelników: W nowszych systemach operacyjnych można i należy używać Core Text. Alternatywnie, można użyć CGContextShowTextAtPoint()- chociaż nie działa z UTF-8.
Ivan Vučica
20

Tak, możesz dołączyć niestandardowe czcionki. Zapoznaj się z dokumentacją UIFont, w szczególności z fontWithName:size:metodą.

1) Upewnij się, że umieściłeś czcionkę w folderze zasobów.

2) „Nazwa” czcionki niekoniecznie jest nazwą pliku.

3) Upewnij się, że masz prawne prawo do używania tej czcionki. Dołączając go do swojej aplikacji, rozpowszechniasz go i musisz mieć do tego prawo.

sierpień
źródło
Czy udało ci się to zrobić? Nie mogę sprawić, żeby działało, a googling odnajduje tylko innych ludzi, którzy próbowali i nie udało się.
Airsource Ltd,
Tak. Mam. Ponownie upewnij się, że używasz właściwej nazwy czcionki.
sierpień
1
Kiedy powiesz „Nazwa” czcionki niekoniecznie jest nazwą pliku…… jak znaleźć poprawną nazwę?
Keith Fitzgerald
7
Tak, ta odpowiedź jest zła. Nie możesz tego zrobić po wyjęciu z pudełka.
Jonathan Sterling
Aktualizacja iOS 9, dokumenty UIFont nie wspominają o niestandardowych czcionkach
Cbas
20

Jeśli używasz xcode 4.3, trzeba dodać fontdo Build Phaseniedostatecznie Copy Bundle Resourceswedług https://stackoverflow.com/users/1292829/arne w wątku, niestandardowe czcionki Xcode 4.3 . To zadziałało dla mnie, oto kroki, które wykonałem, aby niestandardowe czcionki działały w mojej aplikacji:

  1. Dodaj czcionkę do swojego projektu. Przeciągnąłem i upuściłem pliki OTF(lub TTF) do nowej grupy, którą utworzyłem i zaakceptowałem wybór xcode copying the files over to the project folder.
  2. Utwórz UIAppFontstablicę z czcionkami wymienionymi jako elementy w tablicy. Tylko rozszerzenie names, a nie rozszerzenie (np. „ GothamBold”, „ GothamBold-Italic”).
  3. Kliknij project namedrogę u góry Project Navigatorpo lewej stronie ekranu.
  4. Kliknij Build Phaseszakładkę, która pojawi się w głównym obszarze xcode.
  5. Rozwiń Copy Bundle Resourcessekcję „ ” i kliknij, "+"aby dodać czcionkę.
  6. Wybierz plik czcionki w nawigatorze plików, który otwiera się po kliknięciu przycisku "+".
  7. Zrób to dla każdej czcionki, którą musisz add to the project.
SKris
źródło
12

Oto instrukcje krok po kroku, jak to zrobić. Nie potrzebujesz dodatkowej biblioteki ani żadnego specjalnego kodowania.

http://shang-liang.com/blog/custom-fonts-in-ios4/

Najczęściej problem dotyczy czcionki, a nie metody. Najlepszym sposobem na to jest użycie czcionki, która na pewno będzie działać, na przykład verdana lub geogia. Następnie zmień czcionkę na zamierzoną. Jeśli to nie działa, być może nazwa czcionki jest nieprawidłowa lub czcionka nie jest dobrze sformatowaną czcionką.

5566
źródło
12

Dodanie nowej czcionki do istniejącej aplikacji na iOS jest bardzo łatwe.

Musisz tylko dodać czcionkę, np. Font.ttf, do swojego folderu zasobów.

Otwórz aplikację info.plist. Dodaj nowy wiersz jako „Czcionki dostarczone przez aplikację” i wpisz nazwę czcionki jako font.ttf.

A ustawiając czcionkę, rób tak samo setFont:"corresponding Font Name"

Możesz sprawdzić, czy twoja czcionka została dodana, czy nie NSArray *check = [UIFont familyNames];.

Zwraca całą czcionkę obsługiwaną przez aplikację.

kumar123
źródło
11

Polecam wykonanie jednego z moich ulubionych krótkich samouczków tutaj: http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/, z którego pochodzą te informacje.

Krok 1 - Przeciągnij .ttf lub .otf z Findera do swojego projektu

UWAGA - Pamiętaj, aby kliknąć pole „Dodaj do celów” w głównym celu aplikacji

Przeciągnij pliki czcionek do swojego projektu i kliknij, aby dodać je do celu

Jeśli zapomniałeś kliknąć, aby dodać go do celu kliknij na plik czcionki w hierarchii projektu, a na prawym panelu bocznym kliknij Głównym celem aplikacji w docelowa Membership sekcji

jak dodać czcionki do celu aplikacji, jeśli zapomniałeś

Aby upewnić się, że czcionki są częścią celu aplikacji, upewnij się, że są wyświetlane w zasobach pakietu kopii w fazie kompilacji

jak sprawdzić zasoby, aby zobaczyć, czy czcionki są częścią celu aplikacji

Krok 2 - Dodaj nazwy plików czcionek do swojego Plist

Przejdź do niestandardowych właściwości celu iOS w sekcji informacyjnej i dodaj klucz do elementów w tej sekcji o nazwie Fonts provided by application(powinieneś zobaczyć, że pojawia się jako opcja podczas pisania i ustawia się jako tablica. Kliknij małą strzałkę aby otworzyć elementy tablicy i wpisać nazwy dodanych plików .ttf lub .otf, aby poinformować aplikację, że są to pliki czcionek, które mają być dostępne

UWAGA - jeśli aplikacja ulega awarii bezpośrednio po tym kroku, sprawdź pisownię na dodawanych tutaj elementach

przykładowa lista z dodanymi niestandardowymi czcionkami

Krok 3 - Znajdź nazwy swoich czcionek, aby móc je wywoływać

Dość często nazwa czcionki widoczna w Twojej aplikacji różni się od tego, co Twoim zdaniem opiera się na nazwie pliku tej czcionki, umieść to w kodzie i przejrzyj dziennik tworzony przez aplikację, aby zobaczyć, jaką nazwę czcionki wywołać w kodzie

Szybki

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

Cel C

for (NSString* family in [UIFont familyNames]){
    NSLog(@"%@", family);
    for (NSString* name in [UIFont fontNamesForFamilyName: family]){
        NSLog(@"  %@", name);
    }
}

Twój dziennik powinien wyglądać mniej więcej tak:

Przykład dziennika wyszukiwania w celu znalezienia nazw czcionek

Krok 4 - Użyj nowej niestandardowej czcionki, używając nazwy z kroku 3

Szybki

 label.font = UIFont(name: "SourceSansPro-Regular", size: 18)

Cel C

 label.font = [UIFont fontWithName:@"SourceSansPro-Regular" size:18];
ColossalChris
źródło
10

Znajdź TTF w wyszukiwarce i „Uzyskaj informacje”. Pod nagłówkiem „Pełna nazwa:” otrzymałem nazwę, której użyłem fontWithName(właśnie skopiowałem i wkleiłem dokładną nazwę, w tym przypadku nie było konieczne rozszerzenie „.ttf”).

Nano
źródło
8

Nie jest jeszcze dostępny, ale następna wersja cocos2d (framework do gry 2d) będzie obsługiwać czcionki bitmapowe o zmiennej długości jako mapy znaków.

http://code.google.com/p/cocos2d-iphone/issues/detail?id=317

Autor nie ma ustalonej daty premiery dla tej wersji, ale widziałem post, który wskazywałby, że będzie to za miesiąc lub dwa.

Jan
źródło
8

Jedna ważna uwaga: powinieneś używać „nazwy PostScript” powiązanej z czcionką, a nie jej pełnej nazwy lub nazwiska. Ta nazwa często może różnić się od zwykłej nazwy czcionki.

użytkownik576862
źródło
7

wykonaj ten krok

1) Skopiuj czcionkę do swojego projektu

2) otwórz .plistplik w trybie kodu źródłowego ... (Uwaga - nie otwieraj info.plist)

3) Wcześniej - kliknij czcionkę prawym przyciskiem myszy i otwórz ją w fontforge lub podobnym edytorze oraz installw systemie, powinna byćinstall

4) Wpisz to

 <key>UIAppFonts</key>
<array>
    <string>MyriadPro.otf</string>
</array>

5) Wpisz ten kod w swoim class .m

 [lblPoints setFont:[UIFont fontWithName:@"Myriad Pro" size:15.0]];

Tutaj lblPoints zostaną zmienione od twojego UILabel

Gotowy!! Jeśli nadal nie działa twoja czcionka, najpierw sprawdź kompatybilność czcionek

Kirtikumar A.
źródło
1
dlaczego nie otworzyć info.plist?
Raptor,
dlaczego odstęp między Myraid & Pro w 5. punkcie, gdy nie ma żadnego w Plist w punkcie 4?
jayant rawat
@jayantrawat Jego nazwa czcionki, która jest wyświetlana w systemie po jej zainstalowaniu, a .plist to nazwa pliku czcionek [.ttl lub otf]
Kirtikumar A.
@KirtikumarA. tak, dostałem to ... z powodzeniem wdrożono w aplikacji ..
jayant rawat
@jayantrawat, jeśli moje rozwiązanie pomoże, to poproś o głosowanie nad odpowiedzią, aby inni użytkownicy mogli skorzystać z pomocy w ten sam sposób
Kirtikumar A.
6

Może autor zapomniał nadać czcionce nazwę Mac FOND ?

  1. Otwórz czcionkę w FontForge, a następnie przejdź do Element> Informacje o czcionce
  2. Istnieje opcja „Mac”, w której możesz ustawić nazwę FOND.
  3. W obszarze Plik> Eksportuj czcionkę możesz utworzyć nowy ttf

Możesz także wypróbować opcję „Apple” w oknie eksportu.

ZASTRZEŻENIE : Nie jestem programistą iPhone'ów!

ByteNirvana
źródło
6

Wypróbowałem różne sugestie na tej stronie w iOS 3.1.2 i oto moje wnioski:

Zwykłe używanie [UIFont fontWithName:size:]czcionek w katalogu Resources nie będzie działać, nawet jeśli nazwa FOND jest ustawiona za pomocą FontForge.

[UIFont fontWithName:size:]będzie działać, jeśli czcionki zostaną załadowane najpierw za pomocą GSFontAddFromFile. Ale GSFontAddFromFilenie jest częścią iOS 3.1.2, więc musi być dynamicznie ładowany zgodnie z opisem @rpetrich.

Jacob Wallström
źródło
5

Sprawdzać ATSApplicationFontsPath

Prosta pozycja listy plist, która pozwala dołączyć pliki czcionek do folderu zasobów aplikacji i „po prostu działają” w aplikacji.

Matt Sephton
źródło
Próbowałeś tego na urządzeniu? Nie miałem radości, a googling sugeruje, że ten wpis listy nie jest obsługiwany na iPhonie, mimo że jest udokumentowany dla iPhone OS.
Airsource Ltd,
1
Niestety, obecnie używam go tylko w aplikacji OS X.
Matt Sephton,
5

Kilka porad na tej stronie połączyłem w coś, co działa dla mnie na iOS 5.

Najpierw musisz dodać niestandardową czcionkę do swojego projektu. Następnie postępuj zgodnie z radą @iPhoneDev i dodaj czcionkę do pliku info.plist.

Po wykonaniu tej czynności działa:

UIFont *yourCustomFont = [UIFont fontWithName:@"YOUR-CUSTOM-FONT-POSTSCRIPT-NAME" size:14.0];
[yourUILabel setFont:yourCustomFont];

Musisz jednak znać nazwę Postscriptową swojej czcionki. Postępuj zgodnie z radą @Daniela Wooda i naciśnij Command-i, gdy jesteś w FontBook.

Następnie ciesz się niestandardową czcionką.

AaronBaker
źródło
5

Najpierw dodaj czcionkę w formacie .odt do swoich zasobów, w tym przypadku użyjemy DINEngschriftStd.otf, a następnie użyjemy tego kodu, aby przypisać czcionkę do etykiety

[theUILabel setFont:[UIFont fontWithName:@"DINEngschriftStd" size:21]];

Aby upewnić się, że czcionka jest załadowana do projektu, wystarczy zadzwonić

NSLog(@"Available Font Families: %@", [UIFont familyNames]);

Na .plist musisz zadeklarować czcionkę. Wystarczy dodać rekord „Czcionki dostarczone przez aplikację” i dodać ciąg 0 pozycji z nazwą czcionki (DINEngschriftStd.otf)

Alejandro Luengo
źródło
5

Dla iOS 3.2 i nowszych: użyj metod dostarczonych przez kilka powyżej, które są:

  1. Dodaj plik czcionki (na przykład Chalkduster.ttf ) do folderu Resources projektu w XCode.
  2. Otwórz info.plist i dodaj nowy klucz o nazwie UIAppFonts. Typem tego klucza powinna być tablica.
  3. Dodaj niestandardową nazwę czcionki do tej tablicy, w tym rozszerzenie („ Chalkduster.ttf ”).
  4. Użyj [UIFont fontWithName:@"Real Font Name" size:16]w swojej aplikacji.

ALE „Prawdziwa nazwa czcionki” nie zawsze jest taka, jak w Fontbooku. Najlepszym sposobem jest zapytanie urządzenia, jakie czcionki widzi i jakie są dokładne nazwy.

Używam grabera nazw uifont opublikowanego na: grabber nazw uifont

Po prostu upuść czcionki, które chcesz, do projektu xcode, dodaj nazwę pliku do listy odtwarzania i uruchom ją na urządzeniu, dla którego budujesz, a prześle Ci pocztą e-mail pełną listę czcionek, używając nazw, które się UIFont fontWithName:spodziewają.

Jarson
źródło
5

Lepszym rozwiązaniem jest dodanie nowej właściwości Fonts provided by applicationdo info.plistpliku.

Następnie możesz użyć niestandardowej czcionki jak zwykle UIFont.

RichX
źródło
3

Istnieje nowy sposób korzystania z niestandardowych czcionek, zaczynając od iOS 4.1. Pozwala na dynamiczne ładowanie czcionek, niezależnie od tego, czy pochodzą one z plików zawartych w aplikacji, pobranych danych, czy też mają to, co masz. Pozwala także ładować czcionki zgodnie z potrzebami, podczas gdy stara metoda ładuje je wszystkie podczas uruchamiania aplikacji, co może trwać zbyt długo, jeśli masz wiele czcionek.

Nowa metoda została opisana w ios-dynamic-font-loading

Korzystasz z CTFontManagerRegisterGraphicsFontfunkcji, nadając jej bufor z danymi czcionek. Jest on następnie dostępny dla UIFontwidoków internetowych, podobnie jak w starej metodzie. Oto przykładowy kod z tego linku:

NSData *inData = /* your font-file data */;
CFErrorRef error;
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)inData);
CGFontRef font = CGFontCreateWithDataProvider(provider);
if (! CTFontManagerRegisterGraphicsFont(font, &error)) {
    CFStringRef errorDescription = CFErrorCopyDescription(error)
    NSLog(@"Failed to load font: %@", errorDescription);
    CFRelease(errorDescription);
}
CFRelease(font);
CFRelease(provider);
David M.
źródło
Użyłem tego kodu, ale otrzymałem błąd & Błąd Nie udało się załadować czcionki: Nie można ukończyć operacji. (błąd com.apple.coretext 105 - Nie można zarejestrować CGFont '<CGFont (0x14fe7df0): Shruti>')
Hiren
Zgodnie z dokumentacją błąd 105 brzmi kCTFontManagerErrorAlreadyRegistered: „Plik został już zarejestrowany w określonym zakresie”. developer.apple.com/library/ios/#documentation/Carbon/Reference/…
David M.
3

Szybki, kodowy sposób: (działa również z swift 2.0)

Dodaj wymagane czcionki do projektu (podobnie jak dodawanie obrazów, po prostu przeciągnij do Xcode), upewnij się, że są one skierowane do twojego projektu,
dodaj tę metodę i załaduj niestandardowe czcionki (zalecane w appDelegate didFinishLaunchingWithOptions)

func loadFont(filePath: String) {

    let fontData = NSData(contentsOfFile: filePath)!

    let dataProvider = CGDataProviderCreateWithCFData(fontData)
    let cgFont = CGFontCreateWithDataProvider(dataProvider)!

    var error: Unmanaged<CFError>?
    if !CTFontManagerRegisterGraphicsFont(cgFont, &error) {
        let errorDescription: CFStringRef = CFErrorCopyDescription(error!.takeUnretainedValue())
        print("Unable to load font: %@", errorDescription, terminator: "")
    }

}

Użyj przykładu:

if let fontPath = NSBundle.mainBundle().pathForResource("My-Font", ofType: "ttf"){
      loadFont(fontPath)
}

Użyj czcionki:

UIFont(name: "My-Font", size: 16.5)
Daniel Krom
źródło
Zastanawiające mnie, dlaczego nie dodasz po prostu czcionki do Info.plist, wydaje się, że jest o wiele więcej pracy na to samo.
Stephen Jesse
2

Możesz dodać wymagane pliki „FONT” w folderze zasobów. Następnie przejdź do Info.plistpliku projektu i użyj KLUCZOWEGO „Czcionki dostarczonej przez aplikację” i wprowadź wartość „NAZWA CZCIONKI”.

Następnie możesz wywołać metodę [UIFont fontwithName:@"FONT NAME" size:12];

Nishan29
źródło
1

Zrobiłem wszystko, ale nowe czcionki się nie pojawiają, więc znalazłem rozwiązanie:

Podczas przeciągania plików fot (otf lub ttf) NIE zapomnij zaznaczyć pola wyboru w sekcji „Dodaj do celów”.

Po wykonaniu tej czynności pojawi się czcionka i wszystko będzie działać poprawnie.

ElizaS
źródło
1

Chociaż niektóre z powyższych odpowiedzi są poprawne, napisałem szczegółowy samouczek wizualny dla osób, które nadal mają problemy z czcionkami.

Rozwiązania powyżej, które każą Ci dodać czcionkę do listy i używać

[self.labelOutlet setFont:[UIFont fontWithName:@"Sathu" size:10]];

są poprawne. Proszę, skorzystaj teraz w jakikolwiek inny sposób. Jeśli nadal masz problemy ze znalezieniem nazw czcionek i ich dodaniem, oto samouczek -

Używanie niestandardowych czcionek w aplikacji iOS

Bharat Gulati
źródło
Właśnie tego spróbowałem. Wydaje się, że działa, ale moja czcionka jest niewielka, bez względu na ustawiony rozmiar. Dla tego, co jest warte, używam darmowego pliku OTF: philsfonts.com/index.php/free_fonts
ari gold
Wypróbuj inną niestandardową czcionkę, a jeśli problem będzie się powtarzał, daj mi znać. Jeśli działa w ten sposób, oznacza to problem z czcionką.
Bharat Gulati
1

tak, możesz użyć niestandardowej czcionki w swojej aplikacji

krok po kroku następująco:

Dodaj niestandardowe pliki czcionek do projektu w plikach pomocniczych

Dodaj klucz do pliku Info.plist o nazwie UIAppFonts.

Uczyń ten klucz tablicą

Dla każdej posiadanej czcionki wprowadź pełną nazwę pliku czcionki (w tym rozszerzenie) jako elementy tablicy UIAppFonts

Zapisz Info.plist Teraz w swojej aplikacji możesz po prostu wywołać [UIFont fontWithName: @ „Twoja niestandardowa nazwa czcionki” rozmiar: 20], aby uzyskać niestandardową czcionkę do użycia z UILabels po zastosowaniu tego, jeśli nie uzyskasz właściwej czcionki, a następnie kliknij dwukrotnie na niestandardowej czcionce i uważnie zobacz, jak nadchodzi górna nazwa czcionki i skopiuj tę czcionkę, wklej tutaj [UIFont fontWithName: @ „tutaj obok niestandardowej nazwy czcionki” rozmiar: 20]

mam nadzieję, że dostaniesz poprawną odpowiedź

Akhil Bhadauria
źródło
1

tak, możesz użyć niestandardowej czcionki w swojej aplikacji

krok po kroku następująco:

  • Dodaj niestandardowe pliki czcionek do projektu w plikach pomocniczych
  • Dodaj klucz do Info.plistpliku o nazwie UIAppFonts.
  • Uczyń ten klucz tablicą
  • Dla każdej posiadanej czcionki wprowadź pełną nazwę pliku czcionki (w tym rozszerzenie) jako elementy tablicy UIAppFonts
  • Zapisz Info.plist teraz w swojej aplikacji, możesz po prostu zadzwonić, [UIFont fontWithName:@"your Custom font Name" size:20]aby uzyskać niestandardową czcionkę do użycia z TwojąUILabels

po zastosowaniu tego, jeśli nie otrzymujesz poprawnej czcionki, kliknij dwukrotnie niestandardową czcionkę i zobacz uważnie, że nadchodzi górna nazwa czcionki i skopiuj tę czcionkę, wklej, tutaj [UIFont fontWithName:@" here past your Custom font Name" size:20] mam nadzieję, że otrzymasz poprawną odpowiedź

użytkownik2691469
źródło