Niestandardowe czcionki w iOS 7

102

Tworzę grę i chciałbym użyć niestandardowej czcionki w mojej aplikacji. Używam do tego SpriteKit, jeśli to ważne. Próbowałem użyć tego https://github.com/deni2s/IBCustomFonts, ale nie mogę zmusić go do pracy z tą czcionką http://www.fontspace.com/freaky-fonts/emulogic

Próbowałem różnych rzeczy i zarejestrowałem czcionkę na info.plist aplikacji ... Czy ktoś wie, co się dzieje?

José María
źródło
Czy na pewno używasz poprawnej nazwy czcionki, gdy używasz jej w swoim kodzie?
Nick
1
ten blog może być dla ciebie pomocny codewithchris.com/…
Xu Yin

Odpowiedzi:

277

Przede wszystkim zakładam, że SpriteKit nie robi żadnej różnicy.

  1. Potrzebujesz swojej czcionki w .otf lub .ttf skopiowanej do projektu. Na przykład w Supporting Files.
  2. Musisz edytować plik .plist . Dodaj klucz „Czcionki dostarczane przez aplikację” do pliku plist oraz w pozycji 0 skopiuj dokładną nazwę pliku skopiowanej czcionki do plików pomocniczych z rozszerzeniem. Na przykład: „JosefinSansStd-Light_0.otf”
  3. Upewnij się, że czcionka zaimportowana do aplikacji jest pakowana do samej aplikacji. Zrób to, wybierając Cel , następnie Fazy ​​Budowy , a następnie Kopiuj Zasoby Paczki . Jeśli nie widzisz tam swojej czcionki, przeciągnij ją z plików pomocniczych .

Na koniec chciałbyś wyświetlić listę wszystkich czcionek po uruchomieniu aplikacji, aby zobaczyć użyteczną nazwę czcionki. Zrobisz to za pomocą tego małego fragmentu kodu:

NSArray *fontFamilies = [UIFont familyNames];
for (int i = 0; i < [fontFamilies count]; i++)
{
    NSString *fontFamily = [fontFamilies objectAtIndex:i];
    NSArray *fontNames = [UIFont fontNamesForFamilyName:[fontFamilies objectAtIndex:i]];
    NSLog (@"%@: %@", fontFamily, fontNames);
}

Wyszukaj swoją czcionkę w wydrukowanych wynikach, na przykład wyszukałbym „Josefin” i zobaczyłbym, że rzeczywista nazwa czcionki to „JosefinSansStd-Light”. Następnie wystarczy użyć tej czcionki przez:

UIFont *customFont = [UIFont fontWithName:@"JosefinSansStd-Light" size:20];

W iOS8 dodajesz swoje czcionki bezpośrednio do projektu i są one widoczne w kreatorze interfejsu. Zmodyfikuj kod, aby uwzględnić to, ale programowo ustawiając czcionkę dla systemu iOS7 i wybierając ją w konstruktorze interfejsu xCode6. PS. Kreator interfejsu w xCode6 podaje poprawną nazwę czcionki, którą możesz skopiować i wkleić do poniższego kodu.

#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

 if(SYSTEM_VERSION_LESS_THAN(@"8.0"))
    {
        UIFont *customFont = [UIFont fontWithName:@"OpenSans-Light" size:32];
        self.registerLabel.font = customFont;  
    }

Mam nadzieję, że to pomoże.

jovanjovanovic
źródło
Dzięki! Mam to! Problem polegał na tym, że nie chciałem go dodać do Supporting Files, więc nie ładował się: P
José María,
1
Musiałem użyć klucza plist z UIAppFonts
Mike Flynn,
1
Odtworzyłem moją aplikację, cały projekt z iOS7 / Xcode 5.1.1 na projekt iOS8 / Xcode 6.0. Niestandardowa czcionka nie była wyświetlana, dopóki nie wykonałem drugiego kroku. Wyjaśnienie dla Gr8!
MB_iOSDeveloper,
1
Ten sam kod do pobierania nazw czcionek w Swift: let fontFamilies = UIFont.familyNames() for familyName in fontFamilies { let fontNames = UIFont.fontNamesForFamilyName(familyName as String) println("\(familyName): \(fontNames)") }
Alexander Bekert
1
Szybki kod do drukowania wszystkich nazw czcionek:for name in UIFont.familyNames() { debugPrint(UIFont.fontNamesForFamilyName(name)) }
gimenete
24

Nie ma problemu z użyciem niestandardowych czcionek, zrobiłem to. Wykonaj następujące kroki:

  1. Zarejestruj czcionkę na swojej info.plist, dodając wpis „Czcionki dostarczone przez aplikację”. Wpisz nazwę pliku czcionki, a nie nazwę czcionki. Podobnie jak font.ttf (myślę, że już to zrobiłeś)
  2. Przejdź do swojego projektu w nawigatorze projektów, kliknij nazwę projektu i przejdź do „faz budowy”, a następnie spójrz w dół w polu „Kopiuj zasoby pakietu”, przejdź na dół, jest dużo plików i wyszukaj znak „+”. Otworzy się wyskakujące okienko z plikami projektu. Wyszukaj plik czcionki i dodaj go do pakietu.
  3. Na koniec sprawdź nazwę czcionki. Kiedy używasz go w swoim kodzie, musisz użyć nazwy czcionki, a nie nazwy pliku. Aby poznać nazwę czcionki, kliknij dwukrotnie plik czcionki w Finderze, a otworzy się okno z czcionką. Sprawdź tytuł okna, to nazwa czcionki, której musisz użyć.

I rada, dodaj tę nazwę jako makro w pliku ..Prefix.pch. Łatwiej będzie go użyć w swoim projekcie, jeśli będziesz musiał użyć czcionki wielokrotnie.

Wydaje mi się, że problem, który miałeś, polega na tym, że poprawnie zarejestrowałeś czcionkę, ale nie została skopiowana do pakietu aplikacji. Kiedy więc aplikacja została wykonana, nie mogła znaleźć czcionki. Dlatego ważny jest krok 2. Spędziłem dużo czasu, próbując to rozgryźć za pierwszym razem :)

zago
źródło
2
Kluczowym dla mnie był tytuł czcionki. Dzięki!
Oscar
20

Aby osiągnąć to szybko

Jeśli chcesz wyświetlić listę wszystkich czcionek, gdy aplikacja jest uruchamiana, tylko po to, aby zobaczyć użyteczną nazwę czcionki. Możesz to zrobić za pomocą tego małego fragmentu kodu:

    UIFont.familyNames.forEach {
        print("fontFamily: \($0), fonts: \(UIFont.fontNames(forFamilyName: $0))")
    }
Toye
źródło
lub zUIFont.familyNames.forEach { print("fontFamily: \($0), fonts: \(UIFont.fontNames(forFamilyName: $0))") }
Daniel
5

Nigdy nie byłem w stanie uzyskać tych odpowiedzi, próbując wiele razy. Jedyny sposób, w jaki kiedykolwiek otrzymałem niestandardową czcionkę, aby postępować zgodnie z instrukcjami w zaakceptowanej odpowiedzi, a następnie utworzyć ukrytą etykietę w scenorysie, która używa czcionki. Potrafię programowo używać czcionki. Wiem, że dziwne i zepsute, ale dla mnie zadziałało.

Stuart Clark
źródło
1
masz dokładnie rację. Spojrzałem na wszystko w wielu samouczkach, w tym plist, znacznik wyboru dla docelowego projektu, fazy kompilacji i wreszcie znalazłem poprawną nazwę rodziny czcionek, ale nadal nie działało. Następnie dodałem ukrytą etykietę, jak mówisz, i w końcu się pojawiła. Używam Xcode 7.2 i musi to być błąd.
DrZ214
3

Jeśli korzystasz z Xcode 6, jest to tak proste, jak to tylko możliwe. Po prostu dodaj fontfolder do swojego projektu, dodaj czcionki do folderu i gotowe.

wprowadź opis obrazu tutaj

Idris
źródło
7
Upewnij się, że dodałeś go również do zamierzonego celu. Podstępny hobbit Xcode.
Matt Parkins
3

Jeśli żadna z powyższych metod nie zadziałała, ORAZ zdarza się, że używasz swojej niestandardowej czcionki tylko „programowo” (tj. Nie używałeś jej w żadnym xib), to będziesz musiał jej użyć przynajmniej raz gdzieś w jednym xib, gdziekolwiek .

(PS Stuart Clark - już na to odpowiedział, więc nie ma dla mnie uznania. Jednak zdecydowałem się przeformułować i zamieścić to jako osobną odpowiedź, ponieważ przegapiłem jego odpowiedź, nie było dla mnie jasne, kiedy ją przeczytałem. to rozwiązanie przypadkowo, gdy testowałem niestandardową czcionkę w xib i zobaczyłem, że działa ono w innym miejscu programowo, ale kiedy usunąłem czcionkę z xib, przestało działać programowo.)

Wojtek
źródło
2

Zaktualizowano dla Swift 3.

let fontFamilies:[String] = UIFont.familyNames

for fontFamily: String in fontFamilies {
    let fontNames: [String] = UIFont.fontNames(forFamilyName: fontFamily)
    print("\(fontFamily)  \(fontNames)");
}
Gavin Williams
źródło
0

Może szybka poprawka - zrobiło to dla mnie, gdy czcionka już działała, ale nowa np. Label nie pokazała żądanej czcionki:

czysty, głęboko czysty i pusty folder danych pochodnych.

Mózg
źródło
0
please try below code.
@end
@implementation UILabel (CustomFont)
-(void)setFontName:(NSString *)value{
CGFloat newsize = (self.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self setFont:[UIFont fontWithName:self.font.fontName size:newsize]];
}
@end
@implementation UITextField (CustomFont)
-(void)setFontName:(NSString *)value{
CGFloat newsize = (self.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self setFont:[UIFont fontWithName:self.font.fontName size:newsize]];
}
@end
@implementation UIButton (CustomFont)
-(void)setFontName:(NSString *)value{
CGFloat newsize = (self.titleLabel.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self.titleLabel setFont:[UIFont fontWithName:self.titleLabel.font.fontName size:newsize]];
}
@end
@end

@interface UILabel (CustomFont)
-(void)setFontName:(NSString *)value;
@end
@interface UITextField (CustomFont)
-(void)setFontName:(NSString *)value;
@end
@interface UIButton (CustomFont)
-(void)setFontName:(NSString *)value;
@end
herry.master
źródło