8

これは多くの小さなバグに関連しており、ステレオタイプ的に、ある人にはマイナーであると見なされ、別の人には重大であると見なされる可能性があります。

私がますます気付いているのは、すべてのフレーバー a を使用するUIView animateWithDuration:と、ビューの複数のプロパティなど、実際には不必要に変更され、単純な非表示/表示スタイルのアニメーションなどを実行することです.

UINavigationBar が特定の回転遷移の位置に適切にアニメーション化されない、またはヘッダー ビューがフレームの更新時にステータス バーと一緒にアニメーション化されないなどのシナリオでは、親ビューのときにビューのサブレイヤーが暗黙的に異なる方法でアニメーション化される場合、物事は厄介なようです。プロパティが変更されます...

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

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

別の 1 つは、UINavigationController のビューを変換/回転/スケーリングする必要があり、それを行うために CAAnimation を使用することです。これは、UINavigationController のビューを変更すると、UINavigationBar が正しい位置に移動せず、そのいずれかが親ビューの変換プロパティ値であるためです。 .

この質問の結論として、私は行ったり来たりして、自分の状況に適した場所を見つけてきましたが、主に、これらのシナリオについて他の人がどう思うか聞きたいです。 Apple が提供したものについての洞察を得ることができ、自分のアプローチについてより良く感じることができます。

前もって感謝します。

4

1 に答える 1

20

最終的に、すべての UIKit スタイルのアニメーションは Core Animation スタイルのアニメーションに変換されます。つまり、すべてが Core Animation を使用して実際にアニメーション化されます。API の違いは主に利便性の 1 つです。UIKit スタイルのアニメーション関数はモデル値を更新し、アニメーションをコミットして、時間の経過に伴う変化をプレゼンテーション レイヤーに反映します。

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

さらに、frameは、実際にはcentertransform、および(公開されないonboundsに加えて)で構成される派生プロパティであるため、特殊なケースです。ビューをアニメーション化すると、通常は回転を含む、意図しない問題が多数発生する可能性があります。は明示的にアニメート可能なプロパティではないため、コア アニメーションにはこの問題はありません。ビューのアフィン変換 (スケーリング、移動、回転など) に関連する奇妙な動作に遭遇した場合は、UIKit スタイルのアニメーションでandを使用してみてください。anchorPointCALayerUIViewframeframeCALayerboundscenter

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

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

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

一般に、UIKit スタイルのアニメーション関数を使用して問題に気付くことはめったにありません。したがって、iOS でのアニメーション化に多くの時間を費やしてきた人として、私は次のように言います。

UIKit スタイルのアニメーションは非常に便利なので、できる限りあらゆる場所で使用してください。Core Animation スタイルのアニメーションは、UIKit スタイルのアニメーションで問題が発生した場合、またはレイヤーのモデルとプレゼンテーションの値を更新する方法を特定の制御が必要な場合に使用する必要があります。

于 2016-08-16T01:34:20.670 に答える