13

UIView の drawRect 実装でパスを描画しています:

CGContextSetLineWidth(context, 0.5);
CGContextStrokePath(context);

CGContext でアンチエイリアスをオンにすると、1 ピクセルの線を描画できないようです。

の上

私はアンチエイリアシングをオフにしてみました:

CGContextSetShouldAntialias(context, NO);

しかし、その後、私のコーナーはひどく見えます:

オフ

アンチエイリアシングをオンに保ちながら、この 1 ピクセル ラインのサブピクセル ブラーを停止するにはどうすればよいですか?

4

4 に答える 4

24

iOS で線を描くときは、無限に細い線の座標を指定します。描画された線は、その線の両側にストローク幅の半分だけ延長されます。

無限に細い線が整数座標を持ち、水平または垂直である場合、描画された線は幅 1 ピクセルで黒 (アンチエイリアスあり) ではなく、幅 2 ピクセルでグレーになります。アンチエイリアシングを使用しないと、線はわずかに移動しますが、角が見苦しくなります。

これを解決するには、ピクセルの中央の座標 (例: 200.5 / 170.5) を使用し、アンチエイリアシングをオンにします。

于 2012-05-27T11:15:13.187 に答える
0

次の方法ですべてのコンテキストを翻訳できます。

CGContextSaveGState(context);
CGFloat translation = 0.5f / [[UIScreen mainScreen] scale];
CGContextTranslateCTM(context, translation, translation);
... your drawing here ...
CGContextRestoreGState(context);

それで全部です!

于 2015-08-20T09:21:36.577 に答える
0

私のために働いた唯一の解決策はこれでした:

override func drawRect(rect: CGRect) {

    let context = UIGraphicsGetCurrentContext()

    CGContextSetLineWidth(context, 0.5)

    CGContextMoveToPoint(context, 0.0, 0.25)
    CGContextAddLineToPoint(context, rect.size.width, 0.25)

    CGContextSetStrokeColorWithColor(context, UIColor.blackColor().CGColor)
    CGContextStrokePath(context)
}
于 2016-03-31T08:01:51.020 に答える