2012-08-10 16 views
30

Próbuję zastosować niestandardową czcionkę w całej mojej iOS app. Okazało się, że mogę używać:Jak ustawić niestandardową czcionkę dla całej aplikacji dla systemu iOS bez określania rozmiaru

[[UILabel appearance] setFont:[UIFont fontWithName:@"Proxima Nova" size:17.0]]; 
  • Aby ustawić domyślną czcionkę i rozmiar dla wszystkich UILabels. Jednak nie wszystkie moje UILabels mają ten sam rozmiar czcionki.

  • W Set a default font for whole iOS app? ktoś miał ten sam niepokój i powiedziano mu, aby ustawić parametr wielkości na 0.0, aby ustawić tylko czcionkę, a nie rozmiar czcionki.

  • Kiedy próbowałem to zrobić, cały tekst UILabel w mojej aplikacji zniknął (ponieważ ewidentnie iOS dosłownie przyjął rozmiar czcionki 0.0.

Jakieś sugestie, w jaki sposób mogę uniwersalnie ustawić czcionkę, ale nie rozmiar? Wielkie dzięki!

Odpowiedz

23
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self setFontFamily:@"FagoOfficeSans-Regular" forView:self.view andSubViews:YES]; 
} 

-(void)setFontFamily:(NSString*)fontFamily forView:(UIView*)view andSubViews:(BOOL)isSubViews 
{ 
    if ([view isKindOfClass:[UILabel class]]) 
    { 
     UILabel *lbl = (UILabel *)view; 
     [lbl setFont:[UIFont fontWithName:fontFamily size:[[lbl font] pointSize]]]; 
    } 

    if (isSubViews) 
    { 
     for (UIView *sview in view.subviews) 
     { 
      [self setFontFamily:fontFamily forView:sview andSubViews:YES]; 
     } 
    }  
} 
+8

+1 Jednak takie podejście kończy się niepowodzeniem, jeśli aplikacja korzysta z UITableView. Etykiety w poszczególnych komórkach nie będą aktualizowane przez ten proces. – Fostah

+4

Tak, ale co z tego? Obsługa UILabeli w komórkach UITableView, niezależnie od tego, czy są one niestandardowe czy wbudowane, jest kwestią jednego wiersza tekstu w metodzie cellForRowAtIndexPath tabeli. –

+1

To może być najlepsze, co możesz zrobić, ale inną rzeczą, której to rozwiązanie nie dotyczy, jest inna czcionka, na przykład pogrubienie lub kursywa, gdy masz oddzielną rodzinę dla tych czcionek, na przykład "FagoOfficeSans-Bold". – d512

12

Użyłem zaakceptowane odpowiedź w moim projekcie, ale potrzebne funkcję bardziej uniwersalne, a więc to zmienić czcionkę do każdego możliwego, również ja wybrałem ustawić mapowanie pomiędzy niektórymi czcionkami giełdowych do naszych niestandardowych czcionek, aby były dostępne także poprzez pliki historii i pliki XIB.

+ (void)setupFontsForView:(UIView *)view andSubViews:(BOOL)isSubViews 
{ 
    if ([view respondsToSelector:@selector(setFont:)] && [view respondsToSelector:@selector(font)]) { 
     id  viewObj = view; 
     UIFont *font = [viewObj font]; 

     if ([font.fontName isEqualToString:@"AcademyEngravedLetPlain"]) { 
      [viewObj setFont:[UIFont fontWithName:PRIMARY_FONT size:font.pointSize]]; 
     } else if ([font.fontName hasPrefix:@"AmericanTypewriter"]) { 
      [viewObj setFont:[UIFont fontWithName:SECONDARY_FONT size:font.pointSize]]; 
     } 
    } 

    if (isSubViews) { 
     for (UIView *sview in view.subviews) { 
      [self setupFontsForView:sview andSubViews:YES]; 
     } 
    } 
} 
7

Pisząc kategorię dla etykiety, możemy zmienić czcionki całej aplikacji.

@implementation UILabel (CustomeFont) 

-(void)awakeFromNib 
{ 
    [super awakeFromNib]; 
    [self setBackgroundColor:[UIColor clearColor]]; 
    [self setFont:[UIFont fontWithName:@"Helvetica" size:self.font.pointSize]]; 
} 

@end 
+5

Zdecydowanie odradza się stosowanie nadrzędnych metod klasowych. Przynajmniej nie ma sposobu, aby przywołać oryginalną implementację. – beryllium

3

UIView + DefaultFontAndColor.h

#import <UIKit/UIKit.h> 

@interface UIView (DefaultFontAndColor) 

-(void)setDefaultFontFamily:(NSString*)fontFamily andSubViews:(BOOL)isSubViews andColor:(UIColor*) color; 
@end 

UIView + DefaultFontAndColor.m

#import "UIView+DefaultFontAndColor.h" 

@implementation UIView (DefaultFontAndColor) 

//sets the default font for view classes by default 
-(void)setDefaultFontFamily:(NSString*)fontFamily andSubViews:(BOOL)isSubViews andColor:  (UIColor*) color 
{ 
    if ([self isKindOfClass:[UILabel class]]) 
    { 
     UILabel *lbl = (UILabel *)self; 
     [lbl setFont:[UIFont fontWithName:fontFamily size:[[lbl font] pointSize]]]; 

     if(color) 
      lbl.textColor = color; 
    } 
    else if ([self isKindOfClass:[UIButton class]]) 
    { 
     UIButton *btn = (UIButton *)self; 
     [btn.titleLabel setFont:[UIFont fontWithName:fontFamily size:[[btn.titleLabel font] pointSize]]]; 

     if(color) 
     { 
      btn.tintColor = color; 
     } 
    } 

    if (isSubViews) 
    { 
     for (UIView *sview in self.subviews) 
     { 
      [sview setDefaultFontFamily:fontFamily andSubViews:YES andColor:color]; 
     } 
    } 
} 
@end 

@usage: bez barwnika:

#import "UIView+DefaultFontAndColor.h" 

UIView myView = [[UIView alloc] init] 
[myView setDefaultFontFamily:@"Arial" andSubViews:YES andColor:nil]; 

@usage: kolorem:

#import "UIView+DefaultFontAndColor.h" 

UIView myView = [[UIView alloc] init] 
[myView setDefaultFontFamily:@"Arial" andSubViews:YES andColor:[UIColor greenColor] ]; 
17

Oto rozwiązanie w Objective-C, umieścić ten kategorię gdziekolwiek chcesz zmienić UILabelApperance bez ustawiania UILabelFontSize:

@implementation UILabel (SubstituteFontName) 
- (void)setSubstituteFontName:(NSString *)name UI_APPEARANCE_SELECTOR { 
    self.font = [UIFont fontWithName:name size:self.font.pointSize]; 
} 
@end 

Następnie można zmienić Apperance z:

[[UILabel appearance] setSubstituteFontName:@"SourceSansPro-Light"]; 
+2

Niewiele informacji dla ciekawskich programistów: "UIAppearance szuka makra UI_APPEARANCE_SELECTOR w sygnaturach metod. Każda metoda z tą adnotacją może być używana z serwerem proxy wyglądu." [http://nshipster.com/uiappearance/](http://nshipster.com/uiappearance/) – Zeb

+0

Jak tego użyć w Swift Appdelegate? –

+0

Działa i oszczędza dużo czasu! Dziękuję Ci !! –

5

Swift3 https://gist.github.com/dimohamdy/c47992e14c1a3ee3315c06e2480e121e

Nie można ustawić wyglądu czcionki etykiet, które sprawiają, że tworzę inną wartość domyślnej czcionki, a kiedy ustawię nową czcionkę, otrzymam tylko nazwę nowej czcionki i stary rozmiar etykiety i utworzyć inną czcionkę i ustawić to czcionka

//when you want to set font for all labels in Application 
    UILabel.appearance().defaultFont = UIFont.systemFont(ofSize: 15/*Any Value*/, weight: UIFontWeightThin) 

extension UILabel{ 
    dynamic var defaultFont: UIFont? { 
     get { return self.font } 
     set { 
      //get old size of lable font 
      let sizeOfOldFont = self.font.pointSize 
      //get new name of font 
      let fontNameOfNewFont = newValue?.fontName 
      self.font = UIFont(name: fontNameOfNewFont!, size: sizeOfOldFont) 
     } 
    } 
    } 
+0

Możesz poprawić swoją odpowiedź, wyjaśniając, jak to działa. –

+0

@JamesK sprawdź tę aktualizację –

-1

Odpowiedź Raegtimea ala Swift ...

import UIKit 

extension UIViewController { 
    func setFontFamilyForView(_ fontFamily: String, view: UIView, andSubviews: Bool) { 
     if let label = view as? UILabel { 
      label.font = UIFont(name: fontFamily, size: label.font.pointSize) 
     } 

     if let textView = view as? UITextView { 
      textView.font = UIFont(name: fontFamily, size: textView.font!.pointSize) 
     } 

     if let textField = view as? UITextField { 
      textField.font = UIFont(name: fontFamily, size: textField.font!.pointSize) 
     } 

     if andSubviews { 
      for v in view.subviews { 
       setFontFamilyForView(fontFamily, view: v, andSubviews: true) 
      } 
     } 
    } 
} 
+0

Jeśli chcesz dodać wersję Swift odpowiedzi, edytuj oryginalną odpowiedź, proszę. Nie twórz nowej odpowiedzi Swift. W każdym razie jest to pytanie dotyczące celu. – Sulthan

+0

Jaki jest twój problem? Nie można edytować odpowiedzi, ponieważ nie jest ona moja, nie można dodać tego fragmentu do komentarza z powodu limitu znaków. Znalazłem to pytanie, mimo że pracuję w Swift, więc oczywiście inni też. Pomyślałem, że ten fragment może być dla nich przydatny. Czy nie masz nic lepszego do roboty poza biczowaniem ludzi za pomoc innym? – loglesby

+0

Nie ma potrzeby posiadania dwóch takich samych odpowiedzi w różnych językach. Nawet jeśli odpowiedź nie jest twoja, możesz ją edytować, jeśli masz wystarczającą reputację, lub jeśli nie, dodaj komentarz z prośbą o wersję Swift. To pomoże innym użytkownikom w dodaniu zupełnie nowej odpowiedzi. Dodanie nowej odpowiedzi powinno być ostatecznością, a nie pierwszą. – Sulthan

Powiązane problemy