2012-08-10 18 views
30

iOS appにカスタムフォントを適用しようとしています。サイズを指定せずにiOSアプリ全体のカスタムフォントを設定する方法

[[UILabel appearance] setFont:[UIFont fontWithName:@"Proxima Nova" size:17.0]]; 
  • をすべてUILabelsのデフォルトのフォントとサイズを設定するには:私は私が使用できることを見出しました。しかし、すべて私のUILabelsが同じフォントサイズを共有するわけではありません。

  • Set a default font for whole iOS app?で誰かが同じ懸念を抱いていて、sizeパラメータを0.0に設定してフォントを設定し、フォントサイズを設定しないように指示されました。私はこれをやってみました場合には(明らかにiOSは文字通り0.0フォントサイズを取ったので)

  • 、私のアプリ内のすべてのUILabelテキストが消えました。

どのように私は普遍的にフォントを設定することができますが、どうもありがとう!私は私のプロジェクトで受け入れ答えを使用し、それが可能なあらゆるものにフォントを変更しますので、より一般的な機能を必要に応じて、また、私はいくつかの株式のフォントとの間のマッピングを設定することを選んだきました

答えて

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ただし、あなたのアプリがUITableViewを使用している場合、この方法は失敗します。個々のセル内のラベルは、このプロセスによって更新されません。 – Fostah

+4

はい、でも何ですか? UITableViewCellのUITableViewCellsでの処理は、テーブルのcellForRowAtIndexPathメソッドの1行のテキストの問題です。 –

+1

これは可能な限り最善の方法かもしれませんが、このソリューションでは扱えないもう一つの問題は、 "FagoOfficeSans-Bold"などのフォント用に別のファミリがある場合、太字や斜体などの異なるフォントスタイルです。 – d512

12

私たちのカスタムフォントには、storybuilderや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

ラベルのカテゴリを書くことによって、アプリケーション全体のフォントを変更できます。

@implementation UILabel (CustomeFont) 

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

@end 
+5

クラスメソッドをオーバーライドすることを強くお勧めします。少なくとも、元の実装を呼び出す方法はありません。 – 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:色なし:

#import "UIView+DefaultFontAndColor.h" 

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

@usage:色で:

ここ
#import "UIView+DefaultFontAndColor.h" 

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

どこでもUILabelFontSizeを設定せずにUILabelApperanceを変更したいこのカテゴリを入れて、Objective-Cの溶液である:

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

次に、あなたがApperanceを変更することができます。

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

好奇心旺盛な開発者のための小さな情報: "UIAppearanceはメソッドシグネチャのUI_APPEARANCE_SELECTORマクロを探します。このアノテーションを持つメソッドは、外観プロキシで使用できます。 [http://nshipster.com/uiappearance/](http://nshipster.com/uiappearance/) – Zeb

+0

Swift Appdelegateでこれを使うには? –

+0

これは動作し、多くの時間を節約!ありがとうございました !! –

5

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

デフォルトフォントの他の値を作成するラベルフォントの外観を設定することはできません。新しいフォントを設定すると、新しいフォント名と古いサイズのラベルのみを取得し、他のフォントを作成して設定しますフォント

//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

あなたはどのように動作するか説明することであなたの答えを改善することができます。 –

+0

@JamesKこのアップデートをご確認ください –

-1

Raegtimeの回答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

Swift版の回答を追加したい場合は、元の回答を編集してください。新しい迅速回答を作成しないでください。これはとにかく客観的な質問です。 – Sulthan

+0

あなたの問題は何ですか?文字の制限のためコメントにそのスニペットを追加できませんでしたので、回答を編集できません。 私はSwiftで働いていてもこの質問を見つけました。明らかに他の人もそうです。私はこのスニペットが役に立つと思った。 他人を助けようとしている人を打ち負かすのではなく、他のことをすることは何もありませんか? – loglesby

+0

異なる言語で2つの同じ答えを持つ必要はありません。答えがあなたのものではなくても、評判が十分であれば編集できます。そうでない場合は、Swift版を求めるコメントを追加します。それは、まったく新しい答えを追加する以上に他のユーザーを助けるでしょう。新しい答えを加えることは、最初の手段ではなく、最後の手段でなければなりません。 – Sulthan

関連する問題