2010-04-21 2 views
2

Я пытаюсь нарисовать несколько строк разного цвета.Почему мои линии становятся толще и толще?

Этот код пытается нарисовать два прямоугольника с 1px тонкими линиями. Однако второй прямоугольник рисуется линиями ширины 2px, а первый - с шириной 1px.

- (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); 
} 
+0

Линейное утолщение: оно влияет на всех нас! :-) – Smandoli

+0

shoud Думаю что-то? Или вы говорите, что проблемы с толщиной линии очень распространены? – dontWatchMyProfile

ответ

2

Если память, сглаживание по умолчанию, которые могут вызвать большее количество пикселей, которые будут влиять на чертеже, чем вы собираетесь. Отключите сглаживание для вашего CGContextRef и посмотрите, поможет ли это.

IOS:

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

Mac:

CGContextRef context = [NSGraphicsContext currentContext]; 
[context setShouldAntialias:NO]; 
+0

как отключить сглаживание CGContextRef ?? – harshit2811

+5

'CGContextSetAllowsAntialiasing (context, false);' отключает сглаживание 'CGContextRef'. – Raginmari

1

Первый появляется быть толщиной один пиксель, потому что вы нарисовали его по периметру грязной прямоугольнику, который обрезается UIView для вас, делая его внутренним ударом. Но, по сути, оба прямоугольника имеют одинаковую проблему.

По другому вопросу я написал a full description of the real problem and the real solutions. Выключение AA будет достаточно для прямых линий, но вы будете ненавидеть его, как только вы нарисуете поворот или нарисуете диагональ.