2009-09-21 9 views
5

私はカスタムUIViewを持っていますが、これは-[drawRect:]メソッドを使用して描画されています。カスタムビューの奇妙なアンチエイリアス

問題は、アンチエイリアスが非常に奇妙に作用し、黒い線が水平線または垂直線が非常にぼやけて描画されるためです。

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

アンチエイリアシング:
alt text http://dustlab.com/stuff/antialias.png

いいえ(AAと期待される結果のように見える)アンチエイリアシング:
alt text http://dustlab.com/stuff/no_antialias.png

線幅が正確に1であり、そしてすべての座標が整数値であります。

CGContextStrokeRectを使用して矩形を描画しても同じことが起こりますが、正確に同じCGRectを描画した場合はUIRectStrokeとなりません。

答えて

10

にキャストしない限り、ストロークが両側に等しい量を拡大しているので、あなたは、1つのピクセル幅のラインをぼかしを取得しますを整数座標に配置する必要はありませんが、オフセットは0.5ピクセルです。

このようなストロークラインの正しい座標を計算します。

ところで
CGPoint pos = CGPointMake(floorf(pos.x) + 0.5f, floorf(pos.y) + 0.5f); 

:intにして戻って小数部分を取り除くために浮かぶように自分の価値観をキャストしないでください。これにはCのfloorという関数があります。

+2

これに加えて、AppleはCocoa Drawing Guideの「Doing Pixel-Exact Drawing」のセクションでいくつかのヒントとサンプルコードを提供しています。http://developer.apple.com/mac/library/documentation/Cocoa/コンセプチュアル/ CocoaDrawingGuide/Transforms/Transforms.html#// apple_ref/doc/uid/TP40003290-CH204-BCICIJAJ –

+0

ここでコードを一切使わずに回避する簡単な方法はhttp://www.techpaa.com/2012/06/avoidingです-view-edge-antialiasing.html – ShivaPrasad

+0

@jeeva「UIViewEdgeAntialiasing」はレイヤーのエッジのみです。質問は、Quartzで描かれた線についてです。クォーツの描画は 'UIViewEdgeAntialiasing'の影響を受けません。 –

0

あなたのビューフレームには、おそらく整数ではない浮動小数値があります。フレームはピクセル(フロート)の分画を行うのに十分正確ですが、あなたがint

CGRect frame = CGRectMake((int)self.frame.bounds..., (int)...., (int)...., (int)....);