4

コア アニメーション レイヤーを使用して、次の機能を実装しようとしています。包含スーパーレイヤー内には、2 つのアンカー レイヤーと、2 つを接続する別のレイヤーがあります。次の画像は、状況を明確にする必要があります。左側では、2 つのオレンジ色のアンカーが「A」と「B」とマークされており、緑色の線がそれらを接続しています。囲んでいるレイヤー フレームは点線で表示されます。右側には、私が現在実装しているレイヤー階層が示されています。アンカーと接続の両方が、外側のスーパーレイヤーのサブレイヤーです。コネクテッド コア アニメーション レイヤー スキーム

今、私がやろうとしているのは、アンカーを移動できるようにし、接続を接続したままにすることです。-setFrame:現在、以下に示すコードを使用して、接続レイヤーのメソッドを利用してフレームとパスのプロパティを更新しています。

- (void)setFrame:(CGRect)frame {

CGSize size = frame.size;
CGPoint startPoint = CGPointZero;
if (size.height < 0.0) startPoint.y -= size.height;

CGPathRef oldPath = self.path;
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, startPoint.x, startPoint.y);
CGPathAddLineToPoint(path, NULL, startPoint.x + size.width, startPoint.y + size.height);

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"path"];
animation.duration = [CATransaction animationDuration];
animation.timingFunction = [CATransaction animationTimingFunction];
animation.fromValue = (id)oldPath;
animation.toValue = (id)path;
[self addAnimation:animation forKey:@"pathAnimation"];

self.path = path;
CGPathRelease(path);
[super setFrame:frame];

}

さて、この種の動作はしますが、問題は、フレーム (または位置 + 境界) アニメーションがパス アニメーションと同期して実行されず、接続の遠端が瞬間的に切り離されるジッタリング効果が発生することです (およびその他のいくつかの小さな問題が発生します)。 、おそらく同じコアの問題が原因です)。

私はこの問題をいじくり回してきましたが、成功を緩和するためだけです。ある時点で、接続のフレームを囲んでいるスーパーレイヤーのフレームと同じに設定しました。これにより、目的の効果が得られました (フレームをアニメーション化する必要がなくなったため)。ただし、複数の接続があるコンテキストでのこのソリューションのパフォーマンスが心配です。複数の非不透明で大きなサイズの重なり合うレイヤーが悪いように見えますか?

これに対するより優れた、よりエレガントなソリューションを誰かが持っているでしょうか? ありがとう!

4

2 に答える 2

1

接続レイヤーを実際にストレッチ (スケーリング) して回転させるだけなので、フレームを手動で変更する代わりに、接続レイヤーに変換を適用することを検討しましたか?

アンカー レイヤーの位置に基づくいくつかの基本的な三角法を使用して、回転角度と倍率を計算できるはずです。

于 2011-08-17T09:32:51.523 に答える
0

レイヤーやパスのフレームではなく、パスをアニメートしているため、約 10 分後にパフォーマンスの問題が発生します。50の同時アニメーション。GPU アクセラレーションにより、レイヤーの暗黙的なアニメーション化可能なプロパティを操作する場合にのみ、高いパフォーマンスが得られます。したがって、そのコンテンツ (パスなど) ではなく、そのフレームです。

于 2012-03-06T14:29:35.710 に答える