1

私のプロセスは次のようになります。

  • ポイント次元を使用して、描画する長方形を定義します。
  • 定義CGFloat scale = [[UIScreen mainsScreen] scale]
  • 長方形のサイズにスケールを掛けます
  • を使用して長方形サイズの画像コンテキストを作成しますCGBitmapContextCreate
  • 画像コンテキスト内で描画する
  • 電話CGBitmapContextCreateImage
  • call UIImage imageWithCGImage:scale:orientation: 適切なスケールで。

これにより、網膜と古い画面の両方で常に完璧な画像が得られると思っていましたが、線のコントラスト/太さに細心の注意を払っていませんでした. 一般的に、ストロークは塗りとのコントラストが高いため、今まで気にしていなかった線と塗りのコントラストが低くなっています。

おそらくユーザー空間を誤解していると思いますが、スケーリングと変換による単純な直接変換だと思いました。私の特定のケースでは、網膜スクリーンのダブルスケーリングを除いて、スケーリングと変換は適用されません。

1 ピクセルではなく 2 ピクセルの線をレンダリングしようとする方が簡単に説明でき UIContextSetLineWidth(context, 2)ます。1ピクセル!ただし、Retina ディスプレイでは、これは 2 ピクセルである必要があります。

UIContextSetLineWidth(context, 2 * scale)Retina 画面では 2 ピクセル幅の線が生成されますが、4 ピクセルになると予想しています。

UIContextSetLineWidth(context, 1)部分的に透明な 1 ピクセル幅の線を生成します。ストロークがパスにまたがっていることは理解しているので、2 ピクセル幅のストロークと、パスがピクセル境界上にあるという観点で話すことを好みます。

レンダリングされた線幅が半分に分割されている理由を理解する必要があります。

4

1 に答える 1

1

私のせいです。自分のバグの 99% は、公開した直後に自分で解決しています。

パスを作成してコピーした後、描画コードにCGContextClipを含めます。その後、グラデーションなどの塗りつぶしを適用してから、線を引くと、すべてがきれいに整頓されます。私は数学と特定の描画コードに焦点を当てていたので、クリッピング ラインに気付きませんでしたが、実際にはストローク幅が半分になります。通常、私はこのようなロジックのバグをすぐにキャッチしますが、SO に投稿されたので、答えもここにあるのが適切です。

于 2012-08-06T18:20:41.807 に答える