5

私はそのメソッドUIViewを使用して描画されるカスタムを持っています。-[drawRect:]

問題は、黒い線の水平線または垂直線が非常にぼやけて描かれるため、アンチエイリアシングが非常に奇妙な動作をすることです。

でアンチエイリアスを無効にするとCGContextSetAllowsAntialiasing、すべてが期待どおりに描画されます。

アンチエイリアシング:
代替テキスト http://dustlab.com/stuff/antialias.png

アンチエイリアシングなし (AA で期待される結果のように見えます):
alt テキスト http://dustlab.com/stuff/no_antialias.png

線幅は正確に 1 で、すべての座標は整数値です。

を使用して四角形を描画すると同じことが起こりますが、 を使用してまったくCGContextStrokeRect同じように描画した場合はそうではありません。CGRectUIRectStroke

4

2 に答える 2

10

ストロークは両側に均等に拡張されるため、1 ピクセル幅の線は整数座標に配置するのではなく、0.5 ピクセルのオフセットで配置する必要があります。

次のようにストロークされた線の正しい座標を計算します。

CGPoint pos = CGPointMake(floorf(pos.x) + 0.5f, floorf(pos.y) + 0.5f);

ところで:小数部分を取り除くために、値を int にキャストして float に戻さないでください。C には という関数がありfloorます。

于 2009-09-21T14:21:26.410 に答える
0

ビュー フレームには、整数ではない float 値が含まれている可能性があります。フレームはピクセルの分数を処理するのに十分なほど正確ですが (float)、int にキャストしないとぼやけてしまいます。

CGRect frame = CGRectMake((int)self.frame.bounds..., (int)...., (int)...., (int)....);
于 2009-09-21T14:10:48.547 に答える