iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
『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プロパティの値がアニメーションすることになる。