この質問を説明するために、Github で非常に小さな Xcode プロジェクトを作成しました (2 つのクラス、11kb のダウンロード)。こちらの要点を参照するか、git clone git@gist.github.com:93982af3b65d2151672e.gitを使用してください。
次のシナリオを検討してください。「コンテナ ビュー」と呼ばれる私のカスタム ビューには、2 つの小さな正方形が含まれています。このスクリーンショットに示されている:
青い四角は 22x22 ポイントUIView
のインスタンスで、赤い四角は 22x22 ポイントのCALayer
インスタンスです。この質問の目的のために、外側のビューのフレームをアニメーション化しながら、2 つの正方形を外側のビューの右下隅に「貼り付ける」必要があります。
タイプ のデフォルト以外のイージング パラメータを使用して、UIView
のクラス メソッド内のコンテナ ビューのフレームを変更します。animateWithDuration:delay:options:animations:completion:
UIViewAnimationCurveEaseOut
[UIView animateWithDuration:1.0 delay:0
options:UIViewAnimationCurveEaseOut
animations:^{ _containerView.frame = randomFrame; }
completion:nil];
注:青の UIView と赤の CALayer のフレームは両方ともsetFrame:
コンテナー ビューのオーバーライドされたメソッドで設定されますが、青の UIView のautoresizingMask
プロパティを UIView の柔軟な左マージンと上マージンに設定した場合、結果は同じになります。
結果のアニメーションでは、青い四角は意図したとおりに角に「くっついています」が、赤い四角はアニメーションのタイミングとイージングの両方を完全に無視しています。これは、Core Animation の暗黙的なアニメーション機能によるものだと思います。これは、これまで何度も私を助けてきた機能です。
2 つの正方形の非同期性を示すアニメーション シーケンスのスクリーンショットを次に示します。
質問: 2 つのフレーム変更を同期して、赤い CALayer と青い UIView の両方が同じアニメーション期間とイージング カーブで移動し、1 つのビューであるかのように互いにくっつく方法はありますか?
PSもちろん、2つの正方形がくっつくという必要な視覚的結果は、たとえば両方のレイヤーをCALayer
sまたはUIView
sにするなど、さまざまな方法で実現できますが、実際の問題が含まれているプロジェクトには、 1 つは CALayer で、もう 1 つは UIView です。