トップ «前の日記(2013-03-23) 最新 次の日記(2013-03-31)» 編集

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|

2013-03-24 [OSX][iOS]内容フィルタ

『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(これまたスペル間違い)を選択すると、元に戻る。

_ 【Cocoa練習帳】

http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

トップ «前の日記(2013-03-23) 最新 次の日記(2013-03-31)» 編集