の正しいフレームの設定:は、一言で言えば、新しく作成されたCAShapeLayer
- あなたが設定した場合
- Appleは自動的
CAShapeLayer
ためframe
またはbounds
を設定しません(とAppleが[UIView sizeThatFits]
と同等のものを実装していません)フレームのサイズを使用してパスのバウンディングボックス...すべてがうまくいかない。どんなにあなたがそれを設定しようとする方法、それはねじアップパス
ので、プログラムでCGPath
新たに追加されたとCAShapeLayer
新しく作成されたの枠を設定する正しい方法は何ですか?アップル社のドキュメントは、この件について黙っている。動作しない、私が試した
物事、:
- 層の
frame
をチェック層 - に追加し、
CGPath
を作成CAShapeLayer
- を作成する - それが
{{0,0},{0,0}}
- ですセット:
layer.frame = CGPathGetBoundingBox(layer.path)
フレームは正しくなりましたが、パスは現在DOUBLEオフセットになっています - 0123を変更しましたパスが効果的に余分な
(x,y)
ピクセルセットにシフトすることになり:
layer.bounds = CGPathGetBoundingBox(layer.path)
- を...それはすべてのナットを行きます。何も意味をなさない
- することで修正してください。
layer.position = CGPathGetBoundingBox(layer.path).origin
- ...いいえサイコロ;まだナッツ。
ことの一つは、私が仕事をしたとしようとしたが、他の場所で問題が発生しました:
EDITは:これはあなたが画面を自動回転させるとすぐにBREAKS。私の推測:アップルの自動回転は、 "変換"プロパティの制御を必要とします。
- 層に追加
- は、レイヤーのフレームをチェックし、
CGPath
を作成CAShapeLayer
- を作成する - それが
{{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
この作品は、しかし...多くのサードパーティコードは、最初の変換fまたはCALayer
はIDです。
これは難しくありません。確かに私はここで間違っている何かがありますか?
(「パスを追加するたびに、手動ですべてのポイントを手動で移動して-1 * (top-left-point.x, top-left-point.y)
を移動する」という提案が1つありました。繰り返しますが、うまくいけば複雑です)
解決方法を見つけましたか? – jannej
まだありません。私は現在、質問自体から回避策を使用しています。それは遅く、維持する痛みです。問題はAppleのコードのバグだと思うのだろうか? – Adam
小規模な補遺が1つあります。私は最終的に ".frame"がAppleによってサポートされていないことを発見しました。これはいたるところで使用されているため、これは奇妙ですが、ドキュメントやAppleのメーリングリストで十分深く掘り下げて読んだら、アップルのエンジニアから、それがうまくいかないと言って、バグを修正しないというメモが見つかりました。あなたは、すべてのために.boundsを使用し、 "readonly"として.frameを扱うことが期待されています。だから特に皮肉なことに、この設定では、.frameが "うまく動作しない"設定の "ほぼ動作します"。 – Adam