トップ «前の日記(2012-12-19) 最新 次の日記(2012-12-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|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|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|

2012-12-20 [OSX][iOS]Cocoa Animation(独自アニメーションの追加)

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に存在するようで、やっぱりアニメーションした。

_ 【Cocoa練習帳】

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

トップ «前の日記(2012-12-19) 最新 次の日記(2012-12-31)» 編集