1

iOS アプリ内に、アニメーション化、ジェスチャによる変換、シェーディング (クォーツコア シャドウを使用)、および編集が必要な uiview がますこれでアニメーションとジェスチャーを実行すると、非常に「ラグ」になります。アニメーションは iPhone ではそれほど「遅延」していませんが、iPad を使用すると、アニメーションはほとんど反応しなくなります (アプリがクラッシュしているように見えるところまで)。Instruments を使用してアプリをテストしましたが、アニメーションが始まるまでアプリはメモリ、CPU、電力をあまり消費しません。デバイスと Intel i7 8GB iMac の両方でテストしましたが、両方でアニメーションが「遅延」しています。UIView

私が実行しているアニメーションは複雑ではなく、X 軸を横切る単純な変換です。アニメーションに関連するすべてのコード行を調べたところ、これらの行が問題であることがわかりました。

viewer.layer.masksToBounds = NO;
viewer.layer.shadowOffset = CGSizeMake(-1, 1);
viewer.layer.shadowRadius = 3;
viewer.layer.shadowOpacity = 0.3;

上記のコードは、アニメーション化するたびに遅延する影をビューに追加します ( viewer)。上記のコードを使用して、次のライン アニメーションを追加すると、うまく機能します。

viewer.layer.shouldRasterize = YES;

このコードの問題は、UIView 内に表示されるコンテンツの品質が大幅に低下することです ( viewer)。shouldRasterizeYES に設定した画像を次に示します。

ラスタライズを使用した UIView

次に、なしのUIView shouldRasterize

ラスタライズなしの UIView

これらのスクリーンショットは両方とも同じ Retina iPad のものです。

究極の質問: どうすればUIView影のある でアニメーションをスムーズに実行できますか (できれば を使用QuartzCore)? 品質を落とさずにコンテンツをラスタライズする方法はありますか?

4

1 に答える 1

3

上のシャドウ プロパティCALayerは、レイヤーのコンテンツに基づいてすべてのフレームでシャドウを再計算する必要があるため、アニメーション化中は非常に非効率的です。幸いなことに、コストのかかる部分はシャドウ パスの計算であるためCGPath、コンテンツの形状を表す を作成して割り当てるだけでlayer.shadowPath、パフォーマンスが飛躍的に向上します。

レイヤーは不透明なデータで完全に満たされているように見えるため、手順shadowPathは非常に簡単です。

layer.shadowPath = [UIBezierPath bezierPathWithRect:(CGRect){CGPointZero, layer.bounds.size}].CGPath;

唯一の欠点は、レイヤーのサイズが変更されるたびにこれを編集する必要があることです。

于 2013-03-01T00:05:50.067 に答える