コア アニメーション レイヤーを使用して、次の機能を実装しようとしています。包含スーパーレイヤー内には、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];
}
さて、この種の動作はしますが、問題は、フレーム (または位置 + 境界) アニメーションがパス アニメーションと同期して実行されず、接続の遠端が瞬間的に切り離されるジッタリング効果が発生することです (およびその他のいくつかの小さな問題が発生します)。 、おそらく同じコアの問題が原因です)。
私はこの問題をいじくり回してきましたが、成功を緩和するためだけです。ある時点で、接続のフレームを囲んでいるスーパーレイヤーのフレームと同じに設定しました。これにより、目的の効果が得られました (フレームをアニメーション化する必要がなくなったため)。ただし、複数の接続があるコンテキストでのこのソリューションのパフォーマンスが心配です。複数の非不透明で大きなサイズの重なり合うレイヤーが悪いように見えますか?
これに対するより優れた、よりエレガントなソリューションを誰かが持っているでしょうか? ありがとう!