4

初めてObjective-CとiOSの基本的な開発を学んでいるところですので、ご容赦ください。私は他の言語のラムダの概念に精通していますが、Objective-Cブロックを使用するのはこれが初めてです。

そこで、UIKitアニメーションのチュートリアルに従って、背景色をアニメーション化して拡張すると思いました。私はこれを書いた:

- (void) setBG: (float)r g:(float)g b:(float)b duration:(float)secs
{
    [UIView animateWithDuration:secs delay:0.0 options:0
                     animations:^{
                         [self setBackgroundColor: [UIColor colorWithRed:r green:g blue:b alpha:1.0]];
                     }
                     completion:nil];
}

だから、私はどういうわけか、animateWithDurationどの変数をアニメートする必要があるかを伝える必要があると思っていました。これは、位置(つまり、xとy)をアニメーション化する例から始め、3つの変数をアニメーション化するためにいくつかの変更を加える必要があるかもしれないと考えました。

しかし、驚いたことに、これは「うまくいった」。どういうわけか、言語は、、、、およびをアニメーションr化することを自動的に決定したようです。コンパイラは実際にブロックを内省していますか?ここで何が起きてるの?時間の経過とともに変更する変数をどのようにして知ることができますか?gbanimateWithDuration

前もって感謝します。

4

3 に答える 3

2

このUIViewクラスには、アニメーション ブロック内にいるかどうか、およびアニメーションのパラメーターが何であるかを追跡するプライベート変数があります。

さまざまなプロパティのセッターがUIViewその状態をチェックします。セッターは、アニメーション ブロック内で呼び出されていることを検出すると、プロパティのアニメーションを作成します。CABasicAnimation(アニメーションは、アタッチされたビューのレイヤーのインスタンスです。)

アニメート可能なプロパティは、UIView Class Referenceにリストされています。

  • frame
  • bounds
  • center
  • transform
  • alpha
  • backgroundColor
  • contentStretch
于 2012-12-14T19:44:26.213 に答える
2

コンパイラは、そのようにコードを解釈しません。それは完全にUIViewクラスによって行われます。

明らかに正確な内部実装はわかりませんが、考えられる方法の 1 つは、 でshouldAnimateフラグを使用することUIViewです。クラス メソッドは、animateWithDuration:...渡したアニメーション ブロックを実行する前に、このフラグをオンにすることができます。のアニメート可能なプロパティのセッター メソッドはUIView、このフラグをチェックして、アニメートする必要があるかどうかを判断します。

- (void)setBackgroundColor:(UIColor *)newColor {
    if (shouldAnimate) {
        // set up and start animation.
    } else {
        _backgroundColor = newColor;  // just set without animating.
    }
    [self setNeedsDisplay];
}

アニメーション ブロックを実行した後、animateWithDuration:...最終的にフラグが再びオフになるためUIView、アニメーション ブロックの外側でプロパティを設定するとアニメーション化されません。

于 2012-12-14T17:32:06.790 に答える
0

UIView animateWithDuration開始状態(元の値)と終了状態(アニメーションブロックで設定した値)の間で線形補間を使用します。時間の経過に伴う変数値のグラフを想像してみてください。目的の期間と2つのポイントを使用して、(0秒、開始値)と(期間、終了値)の間に線を作成します。アニメーションが再生されると、時間の経過とともに線に沿って移動するポイントに基づいて値が更新されます。

したがって、色は値に分解されると思います(rgbは論理的な推測です)。各要素の開始値と終了値があり、アニメーションの期間中に変化します。

于 2012-12-14T19:38:00.257 に答える