3

Ken Burns のようなパン/ズームをアニメーション化しようとしている UIImageView があります。顔の中心(具体的には、人の鼻の端など)から始めて、画像のフルサイズにズームアウトしたいと思います。コードは次のようなものです。

image.frame = // some frame that zooms in on the image;
image.center = // tip of the nose

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:3];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

image.frame = // original frame
image.center = // original centerpoint

[UIView commitAnimations];

Photoshop では、鼻の先端の座標は、アニメーションの開始時に実際に画像を鼻の中央に配置するために上記のコードに入力する必要があった値とは完全に異なります。軸を反映して、スケールの係数を掛けてみました...そして、Photoshopから推測したものに対して、iOSの数値が重要である理由を理解できないようです。

誰かが 2 つの座標系の不一致を指摘できますか?

いくつかの追加情報:

  • imageUIImageView であり、UIViewController の直接の子です
  • 上記の UIViewController は水平方向に配置されています - アプリ全体が横向きモードで実行されます。
4

2 に答える 2

3

フレームとセンターの両方を設定するのは少し冗長です。両方を使用すると、セットアップの一部が失われます。

編集: より正確には、設定するフレームは 2 つだけで、残りは CoreAnimation に任せるべきです。

于 2011-02-26T18:32:25.230 に答える
2

問題は、アニメーションが複雑な方法で発生することです。正確な方法は問題ではありませんが、結果は次のようになります。1 つのメソッドで初期パラメーターを設定してアニメーション化することはできません。初期パラメータを設定してから、アニメーションが発生する [self performSelector:withObject:afterDelay:] メッセージ (すべての [UIView *animation] メッセージ) を送信する必要があります。

したがって、コードは次のようになります。

- (void)one {
    image.frame = // some frame that zooms in on the image;
    image.center = // tip of the nose

    [self performSelector:@selector(two) withObject:nil afterDelay:0];
}

- (void)two {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:3];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    image.frame = // original frame
    image.center = // original centerpoint

    [UIView commitAnimations];
}
于 2011-02-27T09:57:13.877 に答える