iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
NSAnimatablePropertyContainerプトロコルの続きだ。
分かりやすくする為に、単純な浮動小数点の値をアニメーションの対象にしたいと思う。alphaValueだ。
moveメソッドを以下に変更する。
- (void)move
{
if (self.isRight) {
[[self.mover animator] setAlphaValue:1.0];
}
else {
[[self.mover animator] setAlphaValue:0.0];
}
self.isRight = !self.isRight;
}
マウスダウンすると、徐々に透明になり、その次は徐々に表示されると思う。
このアニメーションを違いが分かるように、キー・フレームのアニメーションに置換してみよう。
まずは、QuartzCore/QuartzCore.hをimportし、QuartzCore.frameworkをLinkに加える。
キー・フレームのアニメーションは、以下のとおり。
- (CAKeyFrameAnimation *)opacityAnimation
{
CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
animation.values = [NSArray arrayWithObjects:
[NSNumber numberWithFloat:0.0],
[NSNumber numberWithFloat:0.75],
[NSNumber numberWithFloat:0.0], nil];
animation.keyTimes = [NSArray arrayWithObjects:
[NSNumber numberWithFloat:0.25],
[NSNumber numberWithFloat:0.50],
[NSNumber numberWithFloat:0.75], nil];
return animation;
}
これを対象のNSImageViewに設定する。
self.mover.animations = [NSDictionary dictionaryWithObjectsAndKeys:[self opacityAnimation], @"alphaValue", nil];
プロパティalphaValueを設定すると、これがキーになっているopacityAnimationが取得され、適用される。opacityAnimationは値を0.0、0.75、0.0と変化させるアニメーションなので、点滅するようになったと思う。
この状態で、moveメソッドを前回の内容に戻すとどうなるだろうか?
- (void)move
{
if (self.isRight) {
[[self.mover animator] setFrame:self.leftFramePosiotion];
}
else {
[[self.mover animator] setFrame:self.rightFramePosiotion];
}
self.isRight = !self.isRight;
}
animationsの内容をopacityAnimationのみにしたので、frameで検索されるアニメーションが見つからないと思ったのだが、default animationに存在するようで、やっぱりアニメーションした。