ヒレガス本 20章 課題

20章の課題は以下の2つ。

  1. BigLetterViewの文字にNSShadowを使って影を付ける。
  2. BigLetterViewのの文字にboldやitalicの効果を付けるチェックボックスをつける。

最初の課題は簡単です。メソッドprepareAttributesの末尾にNSShadowに関するコードを追加するだけ。

- (void) prepareAttributes
{
    .
    .
    .

    NSShadow* theShadow = [[NSShadow alloc] init];
    theShadow.shadowOffset = NSMakeSize(3.0, -3.0);

    self.attributes[NSShadowAttributeName] = theShadow;
}

二番目の課題も簡単。以下の手順で実装する。

  • BigLetterViewにboldやitalicのプロパティを追加
  • アクセッサメソッドで、attributesのNSFontAttributeNameキーの値を更新
  • UIはbindingで作成

ヘッダファイルの追加は2行だけ。

@interface BigLetterView : NSView
    .
    .
    .
@property (getter = isBold)   BOOL bold;
@property (getter = isItalic) BOOL italic;
    .
    .
@end

次に実装ファイルに、以下のようなアクセッサを追加。NSFontManagerの説明は、p373を見ればだいたい判る。

@synthesize bold = _bold;

- (void) setBold:(BOOL)inBold
{
    NSFont*        theFont = self.attributes[NSFontAttributeName];
    NSFontManager* theFontManager = [NSFontManager sharedFontManager];

    if( inBold )
    {
        theFont = [theFontManager convertFont:theFont
                                  toHaveTrait:NSBoldFontMask];
    }
    else
    {
        theFont = [theFontManager convertFont:theFont
                               toNotHaveTrait:NSBoldFontMask];
    }

    self.attributes[NSFontAttributeName]            = theFont;

    [self setNeedsDisplay:YES];
}

- (BOOL) isBold
{
    NSFontManager* theFontManager = [NSFontManager sharedFontManager];

    if( [theFontManager traitsOfFont:self.attributes[NSFontAttributeName]] & NSBoldFontMask )
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

italicのアクセッサの説明とコードは省略。

最後のUIの処理は文章では判りにくいので以下の図を参考にしてください。

NSObjectControllerを追加してcontentsにBigLetterViewを指定する。

../../../_images/controller.png

チェックボックスBoldとチェックボックスitalicをObjectController経由でBigLetterViewのboldとitalicにbindingする。

../../../_images/binding1.png

これで、チェックボックスに連動してbigLetterViewの表示が変わるようになります。

プロジェクトファイルは、 Typing_2.zip に置いておきます。