Почему мои линии становятся все толще и толще?

Я пытаюсь нарисовать несколько линий разными цветами.

Этот код пытается нарисовать два прямоугольника с тонкими линиями в 1 пиксель. Однако второй прямоугольник рисуется линиями шириной 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);
}

person dontWatchMyProfile    schedule 21.04.2010    source источник
comment
Утолщение линий: это влияет на всех нас! :-)   -  person Smandoli    schedule 21.04.2010
comment
Может я что-то угадаю? Или вы говорите, что проблемы с толщиной линии очень распространены?   -  person dontWatchMyProfile    schedule 21.04.2010


Ответы (2)


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

iOS:

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

Mac:

CGContextRef context = [NSGraphicsContext currentContext];
[context setShouldAntialias:NO];
person fbrereto    schedule 21.04.2010
comment
как отключить антиалиасинг CGContextRef ?? - person harshit2811; 01.02.2012
comment
CGContextSetAllowsAntialiasing(context, false); отключает сглаживание CGContextRef. - person Raginmari; 11.08.2012

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

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

person Peter Hosey    schedule 23.04.2010