まず、ビューでキー入力を受けるには、そのビューをファーストレスポンダにしなければなりません。ファーストレスポンダとは、ウィンドウ内で一番最初にイベントを受け付けるオブジェクトのことです。初期状態ではウィンドウ自身がファーストレスポンダになっていることがあります。あるビューをマウスでクリックすることで、ファーストレスポンダをそのビューに切り替える要求を出すことができ、ファーストレスポンダになったビューの周りには、フォーカスリングが付く事があります。
ファーストレスポンダになれるのは、そうなることを承諾しているオブジェクトだけです。ファーストレスポンダになるには、NSResponderクラスを継承し、acceptsFirstResponderメソッドをオーバーライドして、YESを返すようにしなければなりません。
@implementation MyTextView
- (BOOL)acceptsFirstResponder
{
return YES;
}
@end
ファーストレスポンダになっている状態でユーザーがキーをタイプすると、keyDown:メソッドが呼ばれるので、これをオーバーライドしてキー入力時の処理を書く事ができます。タイプされたキーの情報はNSEventオブジェクトに格納され、keyDown:メソッドの引数として渡されます。
- (void)keyDown:(NSEvent*)theEvent
{
// タイプされた文字
NSString* character = [theEvent characters];
// タイプされた文字コード
unichar charcode = [[theEvent characters] characterAtIndex:0];
// タイプされたキーのコード
unsigned short keycode = [theEvent keyCode];
}
このとき、[theEvent characters]からは、シフトキーの影響を受けた文字が返されます。つまり、aキーをタイプすると"a"が、シフトキーを押しながらaキーをタイプすれば"A"が返されます。deleteキーやreturnキーなども文字コードを見れば識別できるので、英数字のみの入力ならこれでほとんどのことができます。
[theEvent keyCode]は、キーボード固有のキーコードを返してきます。ASCII文字として認識されない幾つかのキーには、これを使ってタイプされたキーを認識します。
テキストを描画する最も簡単な方法は、NSStringクラスのdrawAtPoint:withAttributes:メソッドを使うことです。最低限、テキストを描画する座標を指定するだけで描画してくれます。
- (void)drawRect:(NSRect)rect
{
NSString* text = @"Hello";
NSPoint point = NSMakePoint(10.0, 10.0);
[text drawAtPoint:point withAttributes:nil];
}
drawAtPoint:withAttributes:メソッドの第二引数には、フォントやカラーといった描画するテキストの属性を設定できます。nilだと全てデフォルトの値が使われます。例えば、これを使ってフォントとカラーを設定すると次のようになります。
- (void)drawRect:(NSRect)rect
{
NSString* text = @"Hello";
NSPoint point = NSMakePoint(10.0, 10.0);
NSFont* font = [NSFont fontWithName:@"HiraMaruPro-W4" size:32.0];
NSColor* color = [NSColor redColor];
NSDictionary* attributes;
attributes = [NSDictionary dictionaryWithObjectsAndKeys:
font, NSFontAttributeName,
color, NSForegroundColorAttributeName,
nil];
[text drawAtPoint:point withAttributes:attributes];
}
フォントを指定する際に使う文字列には、フォントのPostScript名を使います。各フォントのPostScript名は、Font Bookアプリケーションで確認することができます。
Cocoaには、通常の文字列を表すNSStringクラスの他に、属性付き文字列を表すNSAttributedStringクラスがあります。そして、NSAttributedStringにもテキストを描画するdrawAtPoint:メソッドがあります。こちらの場合は、属性情報を自身に持っているため、描画する際は座標を指定するだけです。複数の属性が入り混じったテキストを描画するときは、こっちを使う方がいいでしょう。