2

いろいろな色で線を引いてみました。

このコードは、1 ピクセルの細い線で 2 つの四角形を描画しようとします。ただし、2 番目の長方形は 2 ピクセル幅の線で描画され、最初の長方形は 1 ピクセル幅で描画されます。

- (void)addLineFrom:(CGPoint)p1 to:(CGPoint)p2 context:(CGContextRef)context {  
    // set the current point
    CGContextMoveToPoint(context, p1.x, p1.y);

    // add a line from the current point to the wanted point
    CGContextAddLineToPoint(context, p2.x, p2.y);
}


- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGPoint from, to;



    // ----- draw outer black frame (left, bottom, right) -----
    CGContextBeginPath(context);

    // set the color
    CGFloat lineColor[4] = {26.0f * colorFactor, 26.0f * colorFactor, 26.0f * colorFactor, 1.0f};
    CGContextSetStrokeColor(context, lineColor);

    // left
    from = CGPointZero;
    to = CGPointMake(0.0f, rect.size.height);
    [self addLineFrom:from to:to context:context];

    // bottom
    from = to;
    to = CGPointMake(rect.size.width, rect.size.height);
    [self addLineFrom:from to:to context:context];

    // right
    from = to;
    to = CGPointMake(rect.size.width, 0.0f);
    [self addLineFrom:from to:to context:context];

    CGContextStrokePath(context);
    CGContextClosePath(context);



    // ----- draw the middle light gray frame (left, bottom, right) -----

    CGContextSetLineWidth(context, 1.0f);
    CGContextBeginPath(context);

    // set the color
    CGFloat lineColor2[4] = {94.0f * colorFactor, 94.0f * colorFactor, 95.0f * colorFactor, 1.0f};
    CGContextSetStrokeColor(context, lineColor2);

    // left
    from = CGPointMake(200.0f, 1.0f);
    to = CGPointMake(200.0f, rect.size.height - 2.0f);
    [self addLineFrom:from to:to context:context];

    // bottom
    from = to;
    to = CGPointMake(rect.size.width - 2.0f, rect.size.height - 2.0f);
    [self addLineFrom:from to:to context:context];

    // right
    from = to;
    to = CGPointMake(rect.size.width - 2.0f, 1.0f);
    [self addLineFrom:from to:to context:context];

    // top
    from = to;
    to = CGPointMake(1.0f, 1.0f);
    [self addLineFrom:from to:to context:context];

    CGContextStrokePath(context);
}
4

2 に答える 2

2

メモリが機能する場合、アンチエイリアシングはデフォルトでオンになっているため、意図したよりも多くのピクセルが描画によって影響を受ける可能性があります。アンチエイリアシングをオフにしてCGContextRef、それが役立つかどうかを確認してください。

iOS:

CGContextRef context = UIGraphicsGetCurrentContext();
[context setShouldAntialias:NO];

マック:

CGContextRef context = [NSGraphicsContext currentContext];
[context setShouldAntialias:NO];
于 2010-04-21T16:40:33.697 に答える
1

最初のものは 1 ピクセルの太さで表示されます。これは、UIView がクリッピングして内側のストロークにするダーティ rect の周囲に描画したためです。しかし、実際には、どちらの長方形にも同じ問題があります。

別の質問では、実際の問題と実際の解決策の完全な説明を書きました。直線はAAをオフにすれば十分ですが、回転させたり対角線を引いたりするとすぐに嫌になります。

于 2010-04-23T01:40:59.800 に答える