これは、それを行うためのより簡単で好ましい方法だと思います。
UIBezierPath *newPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(newRadius, newRadius) radius:newRadius startAngle:(-M_PI/2) endAngle:(3*M_PI/2) clockwise:YES];
CABasicAnimation* pathAnim = [CABasicAnimation animationWithKeyPath:@"path"];
pathAnim.fromValue = (id)self.circle.path;
pathAnim.toValue = (id)newPath.CGPath;
pathAnim.duration = 2.0f;
[self.circle addAnimation:pathAnim forKey:@"animateRadius"];
self.circle.path = newPath.CGPath;
このアプローチは、Apple ドキュメントのこちらから入手しました(リスト 3-2 を参照)。ここで重要なことは、アニメーションを設定した直後に を設定し、のfromValue
最終値も に設定することです。アニメーションはモデルの基になる値を変更しないため、他のアプローチでは、シェイプ レイヤーの変数を実際に永続的に変更することはありません。self.circle
path
newPath.CGPath
path
過去に選択した回答のようなソリューションを使用しましたが (removedOnCompletion
などを使用fillMode
)、iOS の特定のバージョンではメモリリークが発生し、そのアプローチが何らかの理由で機能しないこともあります。
このアプローチでは、アニメーションを明示的に (開始場所と終了場所の両方で) 作成し、最後に (最後の行で) パスの最終的な永続値を指定しているため、必要はありません。終了時にアニメーションを削除しないことを台無しにします(このアニメーションを何度も実行するとメモリリークが発生すると思います...削除されていないアニメーションがメモリに蓄積されます)。
bounds
また、円をアニメーション化する必要がないため、 のアニメーションを削除しました。パスがレイヤーの境界外に描画されていても、完全に表示されます (それについてはドキュメントを参照してくださいCAShapeLayer
)。他の理由で境界をアニメーション化する必要がある場合は、同じアプローチを使用できます (fromValue
境界の と最終値を必ず指定してください)。