16

要するに:

  1. frameApple は、またはboundsを自動的に設定しませんCAShapeLayer(また、Apple は に相当するものを実装していません[UIView sizeThatFits]) 。
  2. パスの境界ボックスのサイズを使用してフレームを設定すると、すべてがうまくいきません。どんなに設定しようとしても、パスを台無しにします

CAShapeLayerでは、新しく追加された で新しく作成された のフレームをプログラムで設定する正しい方法は何CGPathですか? Apple のドキュメントはこの件について沈黙を守っています。

私が試したこと、うまくいかないこと:

  1. 作成するCAShapeLayer
  2. を作成CGPathし、レイヤーに追加します
  3. レイヤーを確認してくださいframe- それは{{0,0},{0,0}}
  4. 設定:layer.frame = CGPathGetBoundingBox( layer.path )
  5. フレームは正しくなりましたが、パスは DOUBLE オフセットになりました - を変更するframeと、パスが実質的に余分な(x,y)ピクセル分シフトされます

  6. 設定:layer.bounds = CGPathGetBoundingBox( layer.path )

  7. ...すべてが狂ってしまいます。もう何も意味がない
  8. 実行して修正してみてくださいlayer.position = CGPathGetBoundingBox( layer.path ).origin
  9. ...サイコロはありません。まだナッツ。

私が試したことの1つは、DIDが機能することですが、他の場所で問題を引き起こします:

編集:画面を自動回転するとすぐに壊れます。私の推測: Apple の自動回転には、「変換」プロパティの制御が必要です。

  1. 作成するCAShapeLayer
  2. を作成CGPathし、レイヤーに追加します
  3. レイヤーのフレームを確認してください - それは{{0,0},{0,0}}
  4. 設定:layer.frame = CGPathGetBoundingBox( layer.path )
  5. 設定: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)。繰り返しますが、それは機能しますが、非常に複雑です)

4

1 に答える 1

5

layer.bounds をパスの境界に設定するのは正しいことです — レイヤーのローカル座標空間をパスと一致させたいのです。ただし、レイヤーの位置プロパティを設定して、レイヤーをスーパーレイヤーの適切な場所に移動する必要もあります。

(.frame を設定すると、.bounds と .position の適切な値を計算するフレームワークに変換されますが、常に bounds.origin がそのまま残ります。これは、パスの境界にゼロ以外の原点がある場合に望ましくありません。)

したがって、anchorPoint を通常の (.5, .5) 値から変更しておらず、レイヤーをそのスーパーレイヤーの原点にフラッシュして配置したいと仮定すると、次のようなものが機能するはずです。

CGRect r = CGPathGetBoundingBox(layer.path);
layer.bounds = r;
layer.position = CGPointMake(r.size.width*.5, r.size.height*.5);
于 2013-12-11T16:44:19.097 に答える