コア グラフィックスのパスを面取りしようとしています。誰かがすでに任意の形状に対してこれを行っていますか?もしそうなら、彼らは喜んでコードを共有しますか?
以下に私の実装を含めました。ベベルを決定するために 、 、 の 3 つの変数を使用CGFloat bevelSize
しUIColor highlightColor
ますUIColor shadow
。光源の角度は常に 135 度であることに注意してください。私はまだこれを実装し終えていませんが、基本的に私がやろうとしていることは、2 つの部分に分かれています。パート 1、フォーカル ポイントを生成します。
- パス内の隣接する各線の間の角度の二等分線を見つけます。
- 円弧の場合、二等分線は、円弧の 2 つの終点によって作成される線に垂直な線で、中点から始まります。これにより、アークが使用されるほとんどの状況に対処できます。円弧と直線の二等分線は取りません。そのような場合、弧の二等分線は正常に機能するはずです。
- 次に、隣接する各二等分線の交点に基づいて焦点を計算します。
- 焦点が使用されている形状内にある場合、それ以外の場合は破棄されます。
焦点を生成する目的は、形状を比例的に「縮小」することです。
2 番目の部分はもう少し複雑です。面取り形状の各側面/セグメントを作成する必要があります。私はこれを「中に」描くことによって行います(によってbevelSize
) 最も近い焦点から問題の点まで延びる線の半径に沿った元の形状の各点。2 つの連続した「bevelPoints」がある場合、bevelPoints から元のポイントに沿って拡張し、bevelPoints に戻る UIBezierPath を作成します (これには円弧が含まれることに注意してください)。これにより、塗りつぶしに使用できる「サイド/セグメント」が作成されます。まっすぐな側面では、側面の角度に応じて、シャドウまたはハイライトの色で塗りつぶします。アークについては、ラジアン「アーク」を決定します。そのアークにトランジション アングル (M_PI_4 または M_PI + M_PI_4) が含まれている場合は、それをグラデーションで塗りつぶします (シャドウからハイライト、またはハイライトからシャドウのいずれか適切な方)。それ以外の場合は、単色で塗りつぶします。
アップデート
回答 (以下を参照) を別のブログ投稿に分割しました。上記の実装の詳細は使用しなくなりましたが、参照用にすべて残しています。これが、Core Graphics を使用しようとしている他の人の助けになることを願っています。