要するに:
frameApple は、またはboundsを自動的に設定しませんCAShapeLayer(また、Apple は に相当するものを実装していません[UIView sizeThatFits]) 。- パスの境界ボックスのサイズを使用してフレームを設定すると、すべてがうまくいきません。どんなに設定しようとしても、パスを台無しにします
 
CAShapeLayerでは、新しく追加された で新しく作成された のフレームをプログラムで設定する正しい方法は何CGPathですか? Apple のドキュメントはこの件について沈黙を守っています。
私が試したこと、うまくいかないこと:
- 作成する
CAShapeLayer - を作成
CGPathし、レイヤーに追加します - レイヤーを確認してください
frame- それは{{0,0},{0,0}} - 設定:
layer.frame = CGPathGetBoundingBox( layer.path ) フレームは正しくなりましたが、パスは DOUBLE オフセットになりました - を変更する
frameと、パスが実質的に余分な(x,y)ピクセル分シフトされます設定:
layer.bounds = CGPathGetBoundingBox( layer.path )- ...すべてが狂ってしまいます。もう何も意味がない
 - 実行して修正してみてください
layer.position = CGPathGetBoundingBox( layer.path ).origin - ...サイコロはありません。まだナッツ。
 
私が試したことの1つは、DIDが機能することですが、他の場所で問題を引き起こします:
編集:画面を自動回転するとすぐに壊れます。私の推測: Apple の自動回転には、「変換」プロパティの制御が必要です。
- 作成する
CAShapeLayer - を作成
CGPathし、レイヤーに追加します - レイヤーのフレームを確認してください - それは
{{0,0},{0,0}} - 設定:
layer.frame = CGPathGetBoundingBox( layer.path ) - 設定:
layer.transform = CGAffineTransformMakeTranslation( CGPathGetBoundingBox( layer.path ).origin.x * -1, // same for y-coord: set it to "-1 * the path's origin 
CALayerこれは機能しますが、多くのサードパーティ コードでは、a の初期変換が Identityであると想定されています。
こんなに難しくないはず!確かに私はここで間違っていることがありますか?
(「パスを追加するたびに、手動でカスタム関数を実行してすべてのポイントをシフトする」という提案がありました-1 * (top-left-point.x, top-left-point.y)。繰り返しますが、それは機能しますが、非常に複雑です)