CGContext SetLineWidth(context,1) - 宽度几乎总是至少2个像素而不是1

时间:2010-01-09 12:23:34

标签: iphone quartz-graphics

使用CGContextSetLineWidth(context, 1),宽度几乎总是至少2个像素而不是1

QQCandleStickLayer.m

-(id)init
{
    self = [super init];
    if(self != nil)
    {       
        self.delegate = self;       
        self.opaque = NO;       
    }
    return self;
}

- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context{

    CGContextSetLineWidth(context, 1.0f);
    CGContextSetAllowsAntialiasing(context, false);
    CGContextSetShouldAntialias(context, false);
    CGContextSetInterpolationQuality(context,kCGInterpolationNone);
    CGContextSetShadowWithColor(context, CGSizeMake( 0.0, 0.0 ), 0, NULL);


    CGContextMoveToPoint(context, self.bounds.origin.x+30.5f, self.bounds.origin.y+self.bounds.size.height-indent);
    CGContextAddLineToPoint(context, self.bounds.origin.x+30.5f, self.bounds.origin.y+self.bounds.size.height-(self.bounds.size.height-lastY)); 
    CGContextClosePath(context);
    CGContextSetRGBStrokeColor(context, 119.0f/255, 119.0f/255, 119.0f/255, 1.0);
    CGContextStrokePath(context);
}

QQDefluviumLayer.m

- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context{  
    UIImage *myDefluvium = [UIImage imageNamed:@"delfluviumNewRotatedSmall.png"];
    CGLayerRef layerCircle = CGLayerCreateWithContext(context, myDefluvium.size,NULL);
    if (layerCircle)
    {
        CGContextRef layerContext = CGLayerGetContext(layerCircle);
        CGContextDrawImage(layerContext, (CGRect){ CGPointZero, myDefluvium.size }, myDefluvium.CGImage);       
        CGContextDrawLayerInRect(context, CGRectMake(layer.bounds.origin.x,layer.bounds.origin.y, layer.bounds.size.width,layer.bounds.size.height), layerCircle);
        CFRelease(layerCircle);
    }
}

QuickQuoteViewController.m

defluviumLayer=[[QQDefluviumLayer alloc] init];
    [defluviumLayer setBounds:CGRectMake(0, 0, 61, 343)];
    [defluviumLayer setPosition:CGPointMake(277,246)];
    [self.view.layer addSublayer:defluviumLayer];
    [defluviumLayer update];


    candleStickLayer=[[QQCandleStickLayer alloc] init];
    [candleStickLayer setBounds:CGRectMake(0,0, defluviumLayer.frame.size.width, defluviumLayer.frame.size.height)];
    [candleStickLayer setPosition:CGPointMake(defluviumLayer.position.x,defluviumLayer.position.y)];
    [self.view.layer addSublayer:candleStickLayer];
    [candleStickLayer update];

我正在绘制一个CALayer,并且在图像下面有图像,正如我测试的那样 - 如果我在清晰的白色视图上绘制 - 可以使用宽度1绘制线条,但不能在图像上绘制

3 个答案:

答案 0 :(得分:28)

线宽确实为1像素宽,但一侧为0.5像素宽,另一侧为0.5像素宽。将其粘贴到像素网格上使得两侧的透明度为50像素,宽度为1像素,使其成为2像素宽线,不透明度为50%。

为避免这种情况,请在半像素坐标上绘制线条。

例如,而不是

CGContextMoveToPoint(ctx, 20.0f, 30.0f);
CGContextAddLineToPoint(ctx, 20.0f, 100.0f);

DO

CGContextMoveToPoint(ctx, 20.5f, 30.0f);
CGContextAddLineToPoint(ctx, 20.5f, 100.0f);

答案 1 :(得分:23)

像素点位于2像素之间,如KennyTM所说,默认情况下该行是抗锯齿,然后显示,因此它显示为width = 2.0,关闭Antialias也可以解决问题。

CGContextSetShouldAntialias(context, NO);

来自:sfkaos on iphonedevsdk

我试过,对我来说很好。

答案 2 :(得分:0)

我同意KennyTM,但我必须将0.5添加到Y轴,而不是X轴才能让我的线显示一半。我想这取决于你的线路走向,即水平或垂直!