Interface Builder の NSTextView で NSLayoutManager を置き換える

Interface Builder の NSTextView で NSLayoutManager を置き換える

2007/01/14 10:01am

Cocoa の NSLayoutManagerNSTypesetter をサブクラス化したい場合、Apple のドキュメント “Assembling the Text System by Hand” にあるように、マニュアルで NSTextView を構築してもいいが面倒だ。それに、このままではスクロールビューでデコレートもされてないのでノーグッド。

どうせなら、Interface Builder で配置した NSTextViewNSLayoutManager を置き換えるのが手っ取り早いだろう。コードは以下のようになる。

- (void) awakeFromNib {
  _textStorage = [[NSTextStorage alloc] initWithString:@"Cocoa Programming Topics"];

  NSLayoutManager *layoutManager = [[MyLayoutManager alloc] init];
  [_textStorage addLayoutManager:layoutManager];
  [layoutManager release];

**  NSTextContainer *textContainer = [_textView textContainer];
  [layoutManager addTextContainer:textContainer];
  [textContainer replaceLayoutManager:layoutManager];
**}

肝になるのは NSLayoutManageraddTextContainer: で元々の NSTextContainer を追加したあとに、NSTextContainerreplaceLayoutManager: を呼ぶこと。これで NSLayoutManager を置き換えられる。