iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
『Core Animation for Max OS X and the iPhone』の『6.3 Content Filters』について説明する。
サンプルコードのFilteredViewは、IBActionのスペルが間違っていて、そのままでは動かない。なので、スペル間違いを我慢して、FilteredView.mのメソッド名を変更するか、FilteredView.hのIBActionを正しいスペルに変更し、MainMenu.nibのFilteredView.mの繋がりを張り直す必要がある。ちなみに、著者は後者を選択した。
内容フィルタとは、フィルタを適用したビューの下位ビューに適用されるフィルタのことのようだ。
フィルタの定義は以下のとおり。
- (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(これまたスペル間違い)を選択すると、元に戻る。