『逆引きリファレンス』へ戻る

アプリケーションに同梱したフォントを利用するには

対象:[MacRuby][Mac OS X 10.6(Snow Leopard)]

Mac OS X 10.6(Snow Leopard)のCore Textにはフォントを扱うメソッドが追加されています。ここでは、それらのメソッドを使って MacRubyのアプリケーション ※1にフォントを同梱し、そのフォントを利用する方法を説明します(図1)。※2なお、利用するフォントは オリジナルフォントみかちゃん です。※3

※1:現在(2009年10月10日)、RubyCocoaのアプリケーションでは、Core Textにはフォントを扱うメソッドは利用できません。

※2:本文書は、 MacRuby tips: embed a custom font(英語) を参考にしています。

※3:アプリケーションに同梱して配布することになりますので、フォントの利用条件をよく確認しておきましょう。

use-custome-font_001
図1:オリジナルフォントみかちゃんの使用例

【STEP 1】フォントの用意

まずは、アプリケーションに同梱するフォント「オリジナルフォントみかちゃん」を用意します。 オリジナルフォントみかちゃんの配布サイト からOpenType形式の「みかちゃん-PB」フォントをダウンロード・解凍します。すると、「みかちゃん-PB.otf」ファイルができます。ただし、配布されているファイルはLZH形式ですので、Mac OS Xに付属しているアーカイブユーティリティでは解凍できません。LZH形式のファイルは、 スタッフイットエキスパンダー2009 を使って解凍できます。また、 ZIP形式で圧縮しなおした「みかちゃん-PB」フォント を用意しましたので、よろしければお使いください。

【STEP 2】「CustomFontSample」プロジェクトの作成

CustomFontSampleプロジェクトを作成します。このとき、新規プロジェクトのテンプレートとして、「User Templates」>「Application」カテゴリの「MacRuby Application」を選択します。

【STEP 3】フォントの追加

プロジェクトの「CustomeFontSmaple」>「Resource」グループに「みかちゃん-PB.otf」ファイルを追加します。このとき、 「デスティネーショングループのフォルダに項目をコピーする(必要な場合)」にチェックを入れてください。 (図2)

use-custome-font_002
図2:「CustomeFontSmaple」>「Resource」グループに「みかちゃん-PB.otf」ファイルを追加する

【STEP 4】GUIのデザイン

Interface Builderで図3のようなGUIをデザインします。複数行のラベル(Multiline Label)を1つだけ配置してメインウインドウいっぱいに広げただけのシンプルなGUIです。

use-custome-font_003
図3:GUIのデザイン

【STEP 5】rb_main.rbファイルの修正

rb_main.rbファイルを修正してアプリケーションの起動時に同梱されているフォントを利用できるようにします。

最初に、次のコードを21行目と22行目に追加してフォントのパスからNSURLオブジェクトを生成します。太字の部分が追加部分です。このNSURLオブジェクトは、フォントを利用できるようにするメソッドで使います。

▼rb_main.rbファイル
18:  end
19:end
20:
21:font_location = NSBundle.mainBundle.pathForResource("みかちゃん-PB", ofType: "otf")
22:font_url = NSURL.fileURLWithPath(font_location)
23:
24:# Starting the Cocoa main loop.
24:NSApplicationMain(0, nil)

21行目のコードでは、NSBundle.mainBundleメソッドとNSBundle#pathForResource:ofType:メソッドにより、アプリケーションに同梱されているフォントのパスを取得しています。

メソッド名:NSBundle.mainBundle
説明:NSBundleオブジェクトを取得します。取得したNSBundleオブジェクトは実行されているアプリケーションが配置されているディレクトリに相当します。アプリケーションに同梱されているフォントや画像のパスは、このオブジェクトを使って取得します。
引数なし
クラスリファレンスへのリンク
メソッド名:NSBundle#pathForResource:ofType:
説明:指定した名前(第1引数)や拡張子(第2引数:ofType)に一致するリソースのパスを取得します。拡張子を指定しなければ(空文字列やnilを指定した場合)、名前に一致するリソースのパスを取得します。
第1引数:リソースの名前を指定します。
第2引数(ofType):リソースの拡張子を指定します。
クラスリファレンス

22行目のコードでは、NSURL.fileURLWithPath:メソッドによりフォントのパスからNSURLオブジェクトを生成しています。

メソッド名:NSURL.fileURLWithPath:
説明:指定したパスを表現したNSURLオブジェクトを生成します。
第1引数:パス
クラスリファレンスへのリンク

次に、23行目に次のコードを追加してアプリケーションでフォントを利用できるようにします。

▼rb_main.rbファイル
23:CTFontManagerRegisterFontsForURL(font_url, KCTFontManagerScopeProcess, nil)

このコードでは、CTFontManagerRegisterFontsForURLメソッドによりフォントマネージャーにフォントを登録しています。すると、次のコード例のようにしてNSFontクラスでそのフォントが利用可能になります。

▼登録したフォントはNSFontクラスで利用可能
font = NSFont.fontWithName("mikachan_o-PB", size: 36)
メソッド名:CTFontManagerRegisterFontsForURL
説明:URLで指定したフォントをフォントマネージャー(Font Manager)に登録します。登録に成功した場合、trueを返します。そうでないときはfalseを返します。
第1引数:フォントのURLをNSURLオブジェクトで指定します。
第2引数:登録したフォントの有効範囲や有効期限を定数で指定します。ここでは現在のプロセスのみ使用できることを示すKCTFontManagerScopeProcessを指定しています。他の定数は、クラスリファレンスを参照してください。
第3引数:Objective-CではCFErrorオブジェクトのポインタを指定できるのですが、現在(2009年10月11日)のMacRubyではできません。ここには必ずnilを指定してください。
クラスリファレンスへのリンク

これで、rb_main.rbファイルが修正できました。修正後のrb_main.rbファイルは以下のようになっているはずです。

▼修正後のrb_main.rbファイル
001:#
002:# rb_main.rb
003:# CustomFontSample
004:#
005:# Created by ?? ?? on 09/10/10.
006:# Copyright __MyCompanyName__ 2009. All rights reserved.
007:#
008:
009:# Loading the Cocoa framework. If you need to load more frameworks, you can
010:# do that here too.
011:framework 'Cocoa'
012:
013:# Loading all the Ruby project files.
014:dir_path = NSBundle.mainBundle.resourcePath.fileSystemRepresentation
015:Dir.entries(dir_path).each do |path|
016:  if path != File.basename(__FILE__) and path[-3..-1] == '.rb'
017:    require(path)
018:  end
019:end
020:
021:font_location = NSBundle.mainBundle.pathForResource("みかちゃん-PB", ofType: "otf")
022:font_url = NSURL.fileURLWithPath(font_location)
023:CTFontManagerRegisterFontsForURL(font_url, KCTFontManagerScopeProcess, nil)
024:
025:# Starting the Cocoa main loop.
026:NSApplicationMain(0, nil)

【STEP 7】AppControllerクラスの定義

AppController.rbファイルを追加して、AppControllerクラスを定義します。

最初に、「CustomFontSample」>「Classes」カテゴリにAppController.rbファイルを作成します。このとき、新規ファイルのテンプレートとして、「User Templates」>「Application」カテゴリの「MacRuby Application」を選択します。

続いて、AppController.rbファイルを次のように修正してAppControllerクラスを定義します。

▼修正後のAppController.rbファイル
001:#
002:#  AppController.rb
003:#  CustomFontSample
004:#
005:#  Created by 高尾 宏治 on 09/10/10.
006:#  Copyright (c) 2009 __MyCompanyName__. All rights reserved.
007:#
008:
009:class AppController
010:  attr_accessor :label
011:  
012:  def awakeFromNib
013:    @label.font = NSFont.fontWithName("mikachan_o-PB", size: 36)
014:    @label.stringValue = "オリジナルフォント「みかんちゃん」を使っています。このフォントをシステムにインストールしていません。"
015:  end
016:end
017:

10行目のコードでは、複数行のラベルは操作するためのlabelアウトレットを定義しています。

13行目のコードでは、NSFont.fontWithName:size:メソッドによりオリジナルフォントみかちゃんを示すNSFontオブジェクトを生成して、NSTextField#font=メソッドにより複数行のラベルのフォントを設定しています。フォント名には「mikachan_o-PB」を指定します。ファイル名の「みかちゃん-PB」ではありません。

メソッド名:NSFont.fontWithName:size:
説明:指定したフォント名とサイズのフォントを表現するNSFontオブジェクトを生成します。
第1引数:フォント名を指定します。
第2引数(size):フォントサイズを指定します。
クラスリファレンスへのリンク

修正が完了したら、必ずAppController.rbファイルを保存しておきます。保存しないとInterface Builderとの連携がうまくできず、アウトレットの接続が正しくできませんのでご注意ください。

【STEP 8】アウトレットの接続

それでは、最後の仕上げです。Interface Builderを操作して、AppControllerオブジェクトを追加してlabelアウトレットと複数行のラベルを接続します。

【STEP 9】動作確認

CustomFontSampleをビルド・実行して動作を確認します。図4のようにオリジナルフォントみかちゃんを使ったメインウインドウが表示されているはずです。

use-custome-font_001
図4:オリジナルフォントみかちゃんの使用例

参考情報

『逆引きリファレンス』へ戻る