7

コア グラフィックスのパスを面取りしようとしています。誰かがすでに任意の形状に対してこれを行っていますか?もしそうなら、彼らは喜んでコードを共有しますか?

以下に私の実装を含めました。ベベルを決定するために 、 、 の 3 つの変数を使用CGFloat bevelSizeUIColor highlightColorますUIColor shadow。光源の角度は常に 135 度であることに注意してください。私はまだこれを実装し終えていませんが、基本的に私がやろうとしていることは、2 つの部分に分かれています。パート 1、フォーカル ポイントを生成します。

  1. パス内の隣接する各線の間の角度の二等分線を見つけます。
  2. 円弧の場合、二等分線は、円弧の 2 つの終点によって作成される線に垂直な線で、中点から始まります。これにより、アークが使用されるほとんどの状況に対処できます。円弧と直線の二等分線は取りません。そのような場合、弧の二等分線は正常に機能するはずです。
  3. 次に、隣接する各二等分線の交点に基づいて焦点を計算します。
  4. 焦点が使用されている形状内にある場合、それ以外の場合は破棄されます。

焦点を生成する目的は、形状を比例的に「縮小」することです。

2 番目の部分はもう少し複雑です。面取り形状の各側面/セグメントを作成する必要があります。私はこれを「中に」描くことによって行います(によってbevelSize) 最も近い焦点から問題の点まで延びる線の半径に沿った元の形状の各点。2 つの連続した「bevelPoints」がある場合、bevelPoints から元のポイントに沿って拡張し、bevelPoints に戻る UIBezierPath を作成します (これには円弧が含まれることに注意してください)。これにより、塗りつぶしに使用できる「サイド/セグメント」が作成されます。まっすぐな側面では、側面の角度に応じて、シャドウまたはハイライトの色で塗りつぶします。アークについては、ラジアン「アーク」を決定します。そのアークにトランジション アングル (M_PI_4 または M_PI + M_PI_4) が含まれている場合は、それをグラデーションで塗りつぶします (シャドウからハイライト、またはハイライトからシャドウのいずれか適切な方)。それ以外の場合は、単色で塗りつぶします。

アップデート

回答 (以下を参照) を別のブログ投稿に分割しました。上記の実装の詳細は使用しなくなりましたが、参照用にすべて残しています。これが、Core Graphics を使用しようとしている他の人の助けになることを願っています。

4

1 に答える 1

3

そのため、最終的に、コア グラフィックスで任意の形状を面取りするルーチンを作成することができました。当初の予想をはるかに超える大変な作業になりましたが、楽しいプロジェクトでした。ベベルを実行するための説明とコードをブログに投稿しました。このための完全なクラス (またはクラスのセット) を作成していないことに注意してください。このコードは、すべてのコア グラフィック描画を行うために使用する、より大きなクラスに統合されました。ただし、ほとんどの任意の形状を面取りするために必要なコードはすべてそこにあります。

アップデート

コードをストレート c として書き直して、別のファイルに移動しました。ベベル関数を任意のコンテキスト内から呼び出すことができるように、他のインスタンス変数に依存しなくなりました。

ここでベベルに使用したコードとプロセスについて説明します: Beveling Shapes In Core Graphics

コードは次のとおりです: Github : CGPathBevel

コードは完璧ではありません: 私は提案/修正/物事を行うためのより良い方法を受け入れます.

于 2012-05-29T20:35:04.497 に答える