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

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|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|

2013-03-20 [OSX][iOS]背景フィルタ

『Core Animation for Max OS X and the iPhone』の『6.2 Background Filters』について説明する。

背景フィルタは、自身の配下に下位ビューが存在しているビューに対して、フェルタ効果を適用する為の機能だ。そして、当然だが、背景となるビューを下位ビューが不透明で覆い被さっている場合は、意味をなさないものとなる。

サンプルコードのフィルタの定義は以下のとおり。

- (void)applyFilter { 
  CIVector *center = [CIVector 
                      vectorWithX:NSMidX([self bounds]) 
                      Y:NSMidY([self bounds])];
  CIFilter *torus = [CIFilter filterWithName:@"CITorusLensDistortion" 
                               keysAndValues:kCIInputCenterKey, center, 
                     kCIInputRadiusKey, [NSNumber numberWithFloat:150.0f], 
                     kCIInputWidthKey, [NSNumber numberWithFloat:2.0f], 
                     kCIInputRefractionKey, [NSNumber numberWithFloat:1.7f], 
                     nil];
  torus.name = @"torus"; 
  
  [controls setBackgroundFilters:[NSArray arrayWithObjects:torus, nil]];
  [self addAnimationToTorusFilter];
}

controllsは背景となりビューのことだ。CITorusLensDistortionフィルタの名前を"torus"と設定しているので、これがキーとなる。

アニメーションの定義は以下のとおり。

- (void)addAnimationToTorusFilter { 
  NSString *keyPath = [NSString stringWithFormat:
                       @"backgroundFilters.torus.%@",
                       kCIInputWidthKey];
  CABasicAnimation *animation = [CABasicAnimation 
                                 animationWithKeyPath:keyPath];
  animation.fromValue = [NSNumber numberWithFloat:50.0f];
  animation.toValue = [NSNumber numberWithFloat:80.0f];
  animation.duration = 1.0;
  animation.repeatCount = 1e100f;
  animation.timingFunction = [CAMediaTimingFunction functionWithName:
                              kCAMediaTimingFunctionEaseInEaseOut];
  animation.autoreverses = YES;
  [[controls layer] addAnimation:animation forKey:@"torusAnimation"];
}

ビューのbackgroundFiltersプロパティに"torus"という名前でフィルタを登録したので、キーパスは"backgroundFilters.torus"となる。そして、操作するキーパスは"backgroundFilters.torus.kCIInputWidthKey"ということなので、フィルタのkCIInputWidthKeyプロパティの値がアニメーションすることになる。

_ 【Cocoa練習帳】

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

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