10

アニメーション化することにより、スケーリングして新しい場所に変換したいビューがあります。次のコードでそれを達成しようとしました:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:kDurationForFullScreenAnimation];
[[self animatingView] setFrame:finalRect];
[UIView commitAnimations];

このコードの効果は、ビューが最初にそのコンテンツのサイズを finalRect に変更し、次にそれを新しい場所に変換することです。つまり、スケーリング部分はアニメーション化されません。ビューは新しいサイズに変換されてから変換されます。

この問題はすでに他のいくつかのスレッドで議論されていますが、どれも結論を導き出していません。ただし、タイマーを使用してタイマー コールバックで毎回フレームを設定するという解決策はありますが、パフォーマンス上の欠点があります。

この問題の最も適切な解決策は何ですか?また、最初にこの問題が発生するのはなぜですか?

ありがとう

4

3 に答える 3

33

フレームを設定しても、スケールも変換も行われません。間違った用語を使用しているか、ジョブに間違ったツールを使用しています。(コア アニメーション変換を使用するレイヤーとは対照的に) UIView に影響を与えようとしている場合、スケーリングと変換は両方ともコア グラフィックス アフィン変換を使用して行われます。

ビューをスケーリングするには

// 2x
[rotationView setTransform:CGAffineTransformMakeScale(2.0, 2.0)];

翻訳するには、

// Move origin by 100 on both axis
[rotationView setTransform:CGAffineTransformMakeTranslation(100.0, 100.0)];

これらをアニメーション化するには、アニメーション ブロックでラップします。これらの両方でビューを変換したい場合は、それらを連結する必要があります。

スケールと変換 (変換) がまったく必要ない場合は、ビューの境界と位置を変更したいということです。これらは、への呼び出しで変更されます

[view setBounds:newRect];
[view setCenter:newCenter];

newRectとnewCenterはそれぞれ、画面上の新しい位置を表すCGRectCGPointです。繰り返しますが、これらはアニメーション ブロックでラップする必要があります。

于 2010-08-18T19:44:59.680 に答える
15

ブロック アニメーションの例を次に示します。

CGPoint newCenter = CGPointMake(100.0,100.0);

[UIView animateWithDuration: 1
                      delay: 0
                    options: (UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction)
                 animations:^{object.center = newCenter ; object.transform = CGAffineTransformScale(CGAffineTransformIdentity, 2.0, 2.0);}
                 completion:^(BOOL finished) { }
];
于 2012-09-01T18:15:17.300 に答える
5

この解決策を試してください:

  CGAffineTransform s =  CGAffineTransformMakeScale(0.5f,0.5f);
  CGAffineTransform t = CGAffineTransformMakeTranslation(100, 0);
  v2.transform = CGAffineTransformConcat(t,s); // not s,t

この操作は可換ではありません。この順序は、ある変換を別の変換に適用するために便利な関数を使用する場合の順序とは逆です。

この操作を使用して、たとえば (スケールを削除する) :

    v2.transform =
    CGAffineTransformConcat(CGAffineTransformInvert(s), v2.transform);
于 2014-03-11T11:53:53.947 に答える