5

レイヤーを親ビューと同じサイズに保ちながら、カスタム UIView の境界をアニメーション化しようとしています。そのために、レイヤーの境界をその親ビューと一緒にアニメーション化しようとしています。カスタム描画が境界に沿って正しくサイズを変更するように、アニメーションとして drawLayer:withContext AS を呼び出すレイヤーが必要です。

drawLayer が正しく呼び出され、アニメーションを開始する前に正しく描画されます。しかし、レイヤーが境界アニメーションの各ステップで drawLayer メソッドを呼び出すことができません。代わりに、一度だけ呼び出され、アニメーションの最終フレームで「終了境界」にすぐにジャンプします。

// self.bg is a property pointing to my custom UIView
self.bg.layer.needsDisplayOnBoundsChange = YES;
self.bg.layer.mask.needsDisplayOnBoundsChange = YES;

[UIView animateWithDuration:2 delay:0 options:UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionAutoreverse|UIViewAnimationOptionRepeat animations:^{

    [CATransaction begin];
    self.bg.layer.bounds = bounds;
    self.bg.layer.mask.bounds = bounds;
    [CATransaction commit];

    self.bg.bounds = bounds;
} completion:nil];

境界が (最終フレームだけでなく) アニメーションとして変更を報告しないのはなぜですか? 私は何を間違っていますか?

4

3 に答える 3

1

これは、描画先のレイヤーが画面に表示されているレイヤーと同じではないためです。

レイヤ プロパティをアニメーション化すると、すぐにモデル レイヤの最終値に設定され (お気づきのとおり)、実際のアニメーションはプレゼンテーション レイヤで行われます。

プレゼンテーション レイヤーにアクセスして、アニメーション化されたプロパティの実際の値を確認できます。

CALayer *presentationLayer = (CALayer *)[self.bg.layer presentationLayer];
...

メソッドを提供していないためdrawLayer:withContext、アニメーション中に何を描画したいかは不明ですが、カスタム プロパティをアニメーション化する場合は、これを行うための優れたチュートリアルを次に示します。

于 2013-04-14T17:06:02.317 に答える