1

これは、ステレオタイプでは1人ではマイナーなものとみなされるかもしれないが、別のものでは大きなバグの多くに関連しています。シンプルな非表示/スタイルアニメーションを明らかにするなどを行うには、私はより多くのを気づいた何一般的なケースでは、UIViewアニメーションでコアアニメーションを使用するのが適切な場合

、すべての味UIView animateWithDuration:を使用している場合、それは実際に不必要なものを変更することで、私の意見のように複数のプロパティ..

UINavigationBarのようなシナリオでは、特定のローテーション遷移に対して適切な位置にアニメーション化されないか、またはフレームが更新されたときにステータスバーと共にアニメーション化されないヘッダービューがある場合、ビューのサブレイヤが暗黙のうちに親ビューのプロパティが変更されます。

これらの多くは私が再訪し、CAAnimationsに変換しています。彼らは実際に私のビューのターゲットプロパティ値を変更しないので、管理が容易であるように見えます。

単純な例として、[view setHidden:]を使用してアニメーション化するか、またはアニメーションが表示されますが、アニメーションの実行中はビューが実際に表示されているか非表示になっています。

もう一つ、UINavigationControllerのビューを変更するとUINavigationBarが正しい位置に移動しないため、UINavigationControllerのビューを変換/回転/スケールしてCAAnimationを使用して移動する必要があり、そのいずれかが親であるビューの変換プロパティ値。

結論として、私は前後に行って、自分の状況に対して他のものよりも適切な場所を見つけていましたが、主に、他の人がこれらのシナリオについて考えることを聞きたい、アップルの提供しているものにいくつかの洞察があるなら、自分のアプローチについてより良く感じることができます。

ありがとうございます。

答えて

5

終了時に、すべてのUIKitスタイルのアニメーションがCore Animationスタイルのアニメーションに変換されます。つまり、すべてが実際にCore Animationを使用してアニメーション化されます。 APIの違いはほとんどの場合、便利です:UIKitスタイルのアニメーション関数はモデル値を更新し、プレゼンテーションレイヤーでの経時変化を反映するようにアニメーションをコミットします。

UIKitがアニメートできると言うプロパティをアニメーション化することにも注意する必要があります。たとえば、技術的にUIScrollViewのプロパティをcontentSizecontentOffsetのようにアニメートすることはできますが、正式にはサポートされていないため、潜在的に副作用に対処する必要があります。

はまた、frameは、それが実際には(露出しないUIViewCALayeranchorPointに加えて、)由来centertransform成る性、およびboundsだから特別な場合です。ビューのアニメーションをframeにすると、通常は回転を伴う意図しない問題が発生する可能性があります。 frameCALayerの明示的にアニメート可能なプロパティではないため、Core Animationにはこの問題はありません。 UIKitスタイルのアニメーションでboundscenterを使用すると、そのビューのアフィン変換(スケール、平行移動、回転など)に関連する奇妙な動作が発生した場合は、

アニメーション化に加えてモデル値を更新しているため、UIKitの特定のビューをアニメートすると意図しない副作用やバグが発生する可能性があります。一方、コアアニメーションは、モデルレイヤーまたはプレゼンテーションレイヤーを更新する方法とタイミングをきめ細かく制御できるため、もう少し柔軟性があります。

しかし、私はUIKitが物事を不必要に変更しているとは思っていません。要求されたアニメートされた変更をコミットし、モデル値を更新するために変更する必要があるものを変更します。 frameのようなプロパティをアニメートするときは、現在の実行ループの後にそのビューで暗黙的にlayoutSubviews()を呼び出します。これは他のサブビューにカスケードすることができます。

アニメーション化する前にUIKitですべてのレイアウトロジックを実行させる場合は、layoutIfNeeded()とともにsetNeedsLayout()を呼び出して、アニメーションブロックを呼び出してください。アニメーションがコミットされると同時に、UIビューがサブビュー階層の変更を実際にアニメーション化するようにするには、UIViewAnimationOptions.layoutSubviewsオプションを指定します。これにより、アニメーションブロック内ですぐにサブビューレイアウトがトリガーされるため、これらの値もアニメーション化されます。それ以外の場合、アニメーションによって変更されたモデル値は、次の実行ループでレイアウトの更新をトリガーします。

一般的に、私はほとんどUIKitスタイルのアニメーション機能を使用する問題に気づいていません。だから、iOSで膨大な時間を費やしている人として、私はこう言うでしょう:

本当に便利なので、できる限りの場所でUIKitスタイルのアニメーションを使用してください。コアアニメーションスタイルのアニメーションは、UIKitスタイルのアニメーションで問題が発生した場合、またはレイヤのモデルとプレゼンテーション値を更新する必要があるかどうかを具体的に制御する必要がある場合に使用します。

関連する問題