9

このUIViewブロックベースのアニメーションコードの正確な「翻訳」を作成しようとしています。

[UIView animateWithDuration:0.5
                      delay:0.0
                    options:UIViewAnimationOptionCurveEaseInOut
                 animations:^{
                               someView.frame = CGRect(0, 100, 200, 200);
                             }
                 completion:nil];

代わりにCABasicAnimationを使用します。

ここで説明されているように、フレームプロパティは実際には、基になるレイヤーの位置境界、およびアンカーポイントの組み合わせであることを完全に認識しています: http : //developer.apple.com/library/mac/#qa/qa1620/_index .html
...そして私はすでにそのようなソリューションを作成しました。2つのCABasicAnimationsを使用して、1つは位置を設定し、もう1つは境界用であり、その1つのビューで機能します。

ただし、問題は、ビュー内にサブビューがあることです。someViewには、タイプUIScrollViewのサブビューがあり、タイプUIImageViewのさらに別のサブビューを配置します。UIScrollViewサブビューでは、autoresizingMaskがUIViewAutoresizingFlexibleWidth |に設定されています。UIViewAutoresizingFlexibleHeightUIViewブロックベースのバージョンを使用すると、すべてが完全に機能しますが、 CABasicAnimationsを使用しようとすると、サブビューが予期しない動作を開始します(つまり、サイズが正しくない幅になります)。したがって、CABasicAnimationsを使用すると、autoresizingMask正しく機能していないようです。サブビューがへの呼び出しを受け取らないことにも気づきましたsetFrame:、ただし、親ビューのフレームプロパティは、レイヤーの位置と境界が変更された後に変更されます。

そのため、UIViewのanimateWithDurationメソッドを使用したときに何が起こっているのかをCABasicAnimationで複製するための正しいコードを知りたいのです。

4

1 に答える 1

12

フレームプロパティは、実際には、基になるレイヤーの位置、境界、およびアンカーポイントの組み合わせであることを完全に認識しています。

frame良いですが、それはレイヤーのアニメート可能なプロパティではないことに注意することも重要です。CABasicAnimationでアニメーション化する場合は、レイヤーでアニメーション化できるプロパティを使用する必要があります。CALayerのドキュメントでは、このようなすべてのプロパティを明示的に「アニメーション化可能」としてマークしています。boundsとを使用するという考えpositionは正しいです。

したがって、このコードは基本的に、以前に行っていたことを実行します。

[CATransaction setDisableActions:YES];
// set final bounds and position
v.layer.bounds = CGRectMake(0,0,200,200);
v.layer.position = CGPointMake(100,200);

// cause those changes to be animated
CABasicAnimation* a1 = [CABasicAnimation animationWithKeyPath:@"bounds"];
a1.duration = 0.5;
CABasicAnimation* a2 = [CABasicAnimation animationWithKeyPath:@"position"];
a2.duration = 0.5;
[v.layer addAnimation:a1 forKey:nil];
[v.layer addAnimation:a2 forKey:nil];

ただし、そのコードは、のサブレイヤーのサイズには影響しませんv.layer。(のサブビューはvのサブレイヤーによって描画されv.layerます。)残念ながら、それはあなたが解決しようとしている問題です。レイヤーのレベルにドロップダウンし、明示的なコアアニメーションを直接表示することで、ビューレベルで発生する自動サイズ変更をあきらめたと思います。したがって、サブレイヤーもアニメートする必要があります。それがビューアニメーションがあなたのためにやっていたことです。

これはiOSの残念な機能です。Mac OS Xには、自動サイズ変更がビューレベル(およびそれ以上)で行うことをレイヤーレベルで行うレイヤー制約(CAConstraint)があります。しかし、iOSにはその機能がありません。

于 2013-03-23T01:44:03.960 に答える