0

左/右/上/下に移動するなど、さまざまなアニメーションを使用して、ある複雑なビューを別の複雑なビューに置き換えようとしています。1 番目と 2 番目のビューには、30 ~ 40 のサブビュー (ボタン) が含まれています。私のコードは次のようなものです:

oldView.alpha = 1;
newView.alpha = 0;
oldView.frame = CGRectMake(0, 0, width, height);
newView.frame = CGRectMake(0, -height, width, height);

// begin animation
// setting duration 0.3
// ...

oldView.alpha = 0;
newView.alpha = 1;
oldView.frame = CGRectMake(0, height, width, height);
newView.frame = CGRectMake(0, 0, width, height);

// commit animation
// ...

iPhone SimulatoriPhone 4Sでは問題なく動作しますが、 iPhone 4では遅れます。ラグとは、12 ~ 15 FPS を意味します。

このアニメーションを高速化するにはどうすればよいですか?

  • centerの代わりにプロパティを使用する必要がありframeますか?
  • ビューを にレンダリングしてUIImageViewアニメーション化する必要がありますか?
  • ビューをレイアウトしてUIScrollView呼び出す必要がありますscrollRectToVisible:animated:か?

そして、なぜ私のアニメーション コードがとても遅いのか説明してください。2 つのビューに 10 ~ 20 個のボタンが含まれている場合、速度に問題はありません...

4

3 に答える 3

1

次のいずれかを試してください。

  • フレームの代わりに中心を変更する
  • フレームの代わりに変換プロパティを使用します。oldView.transform = CGAffineTransformMakeTranslation(0, height);
于 2012-07-03T11:20:20.773 に答える
1

新しいフレームを設定してもパフォーマンスが大幅に低下することはないため、より多くのコードを投稿する必要があります。ただし、ビューlayerや でできることによって、drawRect:描画やアニメーションが大幅に遅くなることがあります。

例えば:

myView.layer.shadowOffset = CGSizeMake(0.0, 10.0);
myView.layer.shadowRadius = 10;
myView.layer.shadowOpacity = 0.40;

ビューに素敵なドロップ シャドウを追加すると、アニメーションが殺されます。したがって、この例では、アニメーション化するときにシャドウをオフにし、完了したら再びオンにします。

コードをもっと見ないと、問題がどこにあるのかを知ることはできません。

編集:

シャドウのレンダリングを高速化するには、shouldRasterizeプロパティを に設定しますYES。これにより、レイヤーはフレームごとに再描画するのではなく、シャドウのビットマップを作成するようになります。

于 2012-07-03T10:56:40.443 に答える