5

UIViewの下部に小さな赤い線を追加しようとしています。

線を1pxの線にしたい。

誰かが次のコードの理由を教えてもらえますか?

- (void)drawRect:(CGRect)rect {
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSaveGState(currentContext);
CGContextSetRGBFillColor(currentContext, 0.0f, 0.0f, 0.0f, 1.0f);
CGContextFillRect(currentContext, RECT(0, 0, rect.size.width, rect.size.height - 8));
CGContextSetLineWidth(currentContext, 1);
CGContextSetRGBStrokeColor(currentContext, 1.0f, 0.0f, 0.0f, 1.0f);
CGContextBeginPath(currentContext);
CGContextMoveToPoint(currentContext, 0, rect.size.height - 7);
CGContextAddLineToPoint(currentContext, rect.size.width, rect.size.height - 7);
CGContextStrokePath(currentContext);
CGContextRestoreGState(currentContext);
}

高さ2pxにまたがる線を描きますか?

4

3 に答える 3

14

積分座標は、ピクセル間の中間の場所を示します。つまり、(0,0)は左上隅、左上のピクセルの左上にあります。同様に、(1,0)は1番目と2番目のピクセルの間にあります。最後に、(0.5,0.5)は左上のピクセルの中央にあります。

CGContextSetLineWidthのドキュメントによると、「ストロークすると、線はパスにまたがり、両側に全幅の半分が表示されます。」したがって、パスがピクセルの間に正確にある場合、線はピクセルの一方の行で半分、もう一方の行で半分だけストロークされます。

したがって、シャープなピクセルラインを取得するには、座標を0.5ピクセルオフセットする必要があります。座標には、の代わりにをx使用します。rect.size.height - 7.5- 7

ちなみに、長方形を描くときは、これCGRectInset(rect, 0.5, 0.5)を実現するのに便利です。

于 2010-09-07T17:49:44.670 に答える
1

iPhone 4を使用していますか?iPhone 4は、倍率2の座標系を使用しているため、必要なものを得るには、線幅を0.5に設定する必要があります。

(座標系はそのように設定されているため、同じコードですべてのモデルで同じ出力が生成されます。)

于 2010-09-07T17:34:24.183 に答える
0

線はデフォルトでアンチエイリアス処理されて描画されます(特に設定しない限り)。したがって、厳密に垂直または水平ではなく、ピクセルで開始および終了する線は、一部の行や列の複数のピクセルを部分的にカバーする可能性があり、細い高コントラストの線ではなく、幅の広い灰色の線のように見えます。

于 2010-09-07T18:40:55.213 に答える