要するに:
frame
Apple は、または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)
。繰り返しますが、それは機能しますが、非常に複雑です)