ヒレガス本 20章 課題
20章の課題は以下の2つ。
- BigLetterViewの文字にNSShadowを使って影を付ける。
- 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を指定する。
チェックボックスBoldとチェックボックスitalicをObjectController経由でBigLetterViewのboldとitalicにbindingする。
これで、チェックボックスに連動してbigLetterViewの表示が変わるようになります。
プロジェクトファイルは、 Typing_2.zip に置いておきます。