web-dev-qa-db-ja.com

ストーリーボードのカスタムフォント?

IOSプロジェクトにフォントを追加しました。プロジェクト内にあり、プロジェクトのビルド時にコピーされます。これは有効なフォントのように見え、アプリを介してデバイス上のすべてのフォントを一覧表示すると表示されます。フォントを含めるためにplistを適切に設定しています。 Xcode 4.2のストーリーボードセクションのテキストコントロール、ボタンなどで使用するには、検索結果が表示されないようです。さらに、フォント名を入力できるようには見えず、フォントダイアログを使用するように強制されます。私もこのフォントをシステムにインストールしようとしましたが、このリストに表示させることができません。コードでのみこれを行う必要がありますか、またはストーリーボードインターフェイスを介してこれを行うことはできますか?

これをコードで動作させることができますが、ストーリーボードを介してこれを行う方がはるかに便利です。

63
slycrel

更新:Xcode 6 Interface Builderでは、カスタムフォントを選択できるようになり、設計時に正しくレンダリングされるようになりました。

私はこの質問がかなり古いことを知っていますが、iOS 5のStoryboard(またはInterface Builder)でカスタムフォントを簡単に指定する簡単な方法を見つけるのに苦労しており、非常に便利なソリューションを見つけました。

まず、 このチュートリアル に従って、プロジェクトにフォントを追加したことを確認します。また、UINavigationBar、UITabBar、およびUISegmentedControlカスタムフォントは、setTitleTextAttributes:メソッドの IAppearanceプロキシ

UIButton、UITextField、UILabel、およびカスタムフォントを必要とするその他のコンポーネントのプロジェクトに以下のカテゴリを追加します。カテゴリは、フォントサイズを維持しながら要素の現在のフォントを変更する新しいプロパティfontNameを実装するだけです。

ストーリーボードでフォントを指定するには、目的の要素(ラベル、ボタン、テキストビューなど)を選択し、ユーザー定義のランタイム属性キーパスに設定してfontNameタイプStringおよびカスタムフォントの名前の値。

Custom font Storyboard

それだけです。カテゴリをインポートする必要さえありません。この方法では、カスタムフォントを必要とするすべてのUIコンポーネントにアウトレットが必要なく、手動でコーディングする必要もありません。

フォントはストーリーボードには表示されませんが、デバイスまたはシミュレーターで実行すると表示されます。


カテゴリーファイル

UIButton + TCCustomFont.h

#import <UIKit/UIKit.h>

@interface UIButton (TCCustomFont)
@property (nonatomic, copy) NSString* fontName;
@end

UIButton + TCCustomFont.m

#import "UIButton+TCCustomFont.h"

@implementation UIButton (TCCustomFont)

- (NSString *)fontName {
    return self.titleLabel.font.fontName;
}

- (void)setFontName:(NSString *)fontName {
    self.titleLabel.font = [UIFont fontWithName:fontName size:self.titleLabel.font.pointSize];
}

@end

UILabel + TCCustomFont.h

#import <UIKit/UIKit.h>

@interface UILabel (TCCustomFont)
@property (nonatomic, copy) NSString* fontName;
@end

UILabel + TCCustomFont.m

#import "UILabel+TCCustomFont.h"

@implementation UILabel (TCCustomFont)

- (NSString *)fontName {
    return self.font.fontName;
}

- (void)setFontName:(NSString *)fontName {
    self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}

@end

UITextField + TCCustomFont.h

#import <UIKit/UIKit.h>

@interface UITextField (TCCustomFont)
@property (nonatomic, copy) NSString* fontName;
@end

UITextField + TCCustomFont.m

#import "UITextField+TCCustomFont.h"

@implementation UITextField (TCCustomFont)

- (NSString *)fontName {
    return self.font.fontName;
}

- (void)setFontName:(NSString *)fontName {
    self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}

@end

また、ダウンロード可能 Gistから および 単一ファイル としても。

トラブルシューティング

fontNameプロパティが指定されていないためにランタイムエラーに対して実行する場合は、フラグ-all_load underその他のリンカーフラグプロジェクト設定で、リンカーにカテゴリーを含めるように強制します。

145
redent84

Xcode6.0以降、 Xcode6.0 release 注:

Interface Builderは、設計時に埋め込まれたカスタムiOSフォントをレンダリングし、完成したアプリがどのように見えるかを正しい寸法でより正確にプレビューします。

ストーリーボードでラベルのフォントを設定できます。次のようにできます

  1. カスタムフォントファイルを取得します(。ttf、。ttc)
  2. フォントファイルをXcodeプロジェクトにインポートする

    enter image description here

  3. app-info.plistで、という名前のキーを追加しますアプリケーションによって提供されるフォント。これは配列タイプで、すべてのフォントファイル名を配列に追加します、注:ファイル拡張子を含めます

enter image description here

  1. ストーリーボードで、UILabelをインターフェイスにドラッグし、ラベルを選択して、Attribute Inspectorに移動し、フォント選択エリアポップアップパネルで、フォントからCustom、および埋め込みフォント名のFamilyを選択します。

enter image description here

参照

58
monjer

これはXCodeのバグであり、3.x以降に存在し、まだ修正されていません。私も同じ問題に直面しており、運が悪かったのでシステムに追加しようとしました。別のSOそれについての投稿 Interface Builderでフォントが表示されない

5
Dan

Monjerの答えは正しいものです。私のように、コンパイル後に追加されたフォントが表示されない場合は、ビルドフェーズにフォントを追加してください(ターゲット->ビルドフェーズ->バンドルリソースのコピー->フォントファイルの追加)

3
HugglesNL

XCode 9.4の時点では、XCodeはまだストーリーボードのフォントを直接尊重していません。設計時には表示できますが、実行時には表示できません。 fontWithName APIを使用している場合、nilを返すことがわかりますが、storyboard/xibで使用した場合、なぜ表示されないのかを知る方法はありません。

  • 実行時にStoryboard/XIBから簡単に機能するようにする唯一の方法は、Copy Bundle Resourcesビルドフェーズに.ttc/.ttfを追加することです。

  • 9.4の時点で、info.plistにフォントファイル名を追加する必要はなくなりました。

1
Nirav Bhatt

redent84のソリューションは最高でした!

NSObjectにカテゴリを追加するだけで改善が加えられるので、一度だけ行う必要があります。

NSObject + CustomFont.h

#import <Foundation/Foundation.h>

@interface NSObject (CustomFont)

@property (strong, nonatomic) NSString *fontName;
@property (strong, nonatomic) UIFont *font;

@end

NSObject + CustomFont.m

#import "NSObject+CustomFont.h"

@implementation NSObject (CustomFont)

@dynamic font;

- (NSString *)fontName
{
    return self.font.fontName;
}

- (void)setFontName:(NSString *)fontName
{
    self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}

@end
0
Rodrigo Ruiz

これらのどれも私にとってはうまくいきませんでしたが、これはうまくいきました。

#import <UIKit/UIKit.h>

@interface UILabelEx : UILabel


@end

#import "UILabelEx.h"
#import "Constants.h"

@implementation UILabelEx

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
    [super traitCollectionDidChange: previousTraitCollection];

    self.font = [UIFont fontWithName:APP_FONT size:self.font.pointSize];   
}
@end
0
Jules