[OSX][iOS]内容フィルタ
サンプルコードのFilteredViewは、IBActionのスペルが間違っている。なので、スペル間違いを我慢して、FilteredView.mのメソッド名を変更するか、FilteredView.hのIBActionを正しいスペルに変更し、MainMenu.nibのIBActionの繋がりを張り直す必要がある。ちなみに、著者は後者を選択した。
内容フィルタとは、フィルタを適用したビューの下位ビューに適用されるフィルタのことのようだ。
フィルタの定義は以下のとおり。
- (void)pointillize
{
CIVector *center = [CIVector vectorWithX:NSMidX([self bounds])
Y:NSMidY([self bounds])];
CIFilter *pointillize = [CIFilter
filterWithName:@"CIPointillize"
keysAndValues:kCIInputRadiusKey,
[NSNumber numberWithFloat:1.0f],
kCIInputCenterKey, center, nil];
pointillize.name = @"pointillize";
[controls setContentFilters:[NSArray arrayWithObjects:pointillize, nil]];
}
CIPointillizeフィルターは、点描スタイルでレンダリングするフィルタだ。
フィルタを実行するIBActionの記述は以下のとおり。
- (IBAction)noPointillize:(id)sender
{
if (0 < [[controls contentFilters] count]) {
[controls setContentFilters:nil];
}
}
- (IBAction)heavyPointillize:(id)sender
{
if (nil == [controls contentFilters]
|| 0 == [[controls contentFilters] count]) {
[self pointillize];
}
NSString *path = [NSString stringWithFormat:
@"contentFilters.pointillize.%@", kCIInputRadiusKey];
[controls setValue:[NSNumber numberWithInt:5.0f] forKeyPath:path];
}
- (IBAction)lightPointillize:(id)sender
{
if (nil == [controls contentFilters]
|| 0 == [[controls contentFilters] count]) {
[self pointillize];
}
NSString *path = [NSString stringWithFormat:
@"contentFilters.pointillize.%@", kCIInputRadiusKey];
[controls setValue:[NSNumber numberWithInt:1.0f]
forKeyPath:path];
}
Heavy Pointalize(スペル間違い!)ボタンを押下すると、コントロール類が荒い点描に、Light Pointalize(これもスペル間違い!)ボタンを押下すると、コントロール類が細かい点描に。ポップアップするメニューでNo Pointalize(これまたスペル間違い)を選択すると、元に戻る。
関連情報
Core Animation for Max OS X and the iPhone
Core Animation for Max OS X and the iPhone
Core Image プログラミングガイド概論
【Cocoa練習帳】
http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)
- Core Animation for Max OS X and the iPhone: Cre.../Pragmatic Bookshelf

- ¥3,480
- Amazon.co.jp