2014-01-26 2 views
0

В приведенном ниже коде показано следующее. Можно заметить, что левая боковая линия имеет тонкую линию по сравнению с правой. Другие наблюдения Квадратная кривая не такая резкая. Как я могу заставить его выглядеть лучше?Коррекция чертежа CoreGraphics

- (void)drawRect:(CGRect)rect 
{  
    CGContextRef contextRef=UIGraphicsGetCurrentContext(); 
    [self drawBatteryEdges:contextRef withFinalBorderRect:rect]; 
} 

-(void) drawBatteryEdges:(CGContextRef) contectRef withFinalBorderRect:(CGRect) batteryRect{ 
    CGFloat topOffset=20.0f; 
    CGFloat bottomOffset=20.0f; 
    CGFloat curveOffset=4f; 

    CGMutablePathRef path=CGPathCreateMutable(); 
    CGPathMoveToPoint(path, NULL, 0, topOffset); 
    CGPathAddQuadCurveToPoint(path, NULL, batteryRect.size.width/2.0, topOffset-(curveOffset), batteryRect.size.width, topOffset); 
    CGPathAddLineToPoint(path, NULL, batteryRect.size.width, batteryRect.size.height-bottomOffset); 
    CGPathAddQuadCurveToPoint(path, NULL, 
           batteryRect.size.width/2.0, (CGPathGetCurrentPoint(path).y)+(curveOffset), 
           0, (CGPathGetCurrentPoint(path).y)); 

    CGPathCloseSubpath(path); 

    CGContextAddPath(contectRef, path); 
    CGContextDrawPath(contectRef, kCGPathStroke); 

} 

Он рисует следующее.

enter image description here

ответ

0

Wenderlich, Рэй. «Учебное пособие по основной графике: линии, прямоугольники и градиенты». 15 апреля 2013 г. http://www.raywenderlich.com/32283/core-graphics-tutorial-lines-rectangles-and-gradients

Ну, получается, что, когда Core Graphics гладит путь, он рисует ход на середину точного края пути.

В вашем случае край пути - это прямоугольник, который вы хотите заполнить. Итак, при рисовании 1-пиксельной линии вдоль этого края половина строки (1/2 пикселей) будет находиться внутри прямоугольника, а другая половина - линия (1/2 пикселя) будет находиться на вне прямоугольника.

Но, конечно же, так как нет никакого способа, чтобы сделать 1/2 пикселя, а ядро ​​ Графика использует сглаживание для рисования в обоих пикселей, но только более легкий оттенок, чтобы создать видимость, что это только один пиксель.

Но вы не хотите никакого сглаживания, вам нужен только один пиксель, дарнит! Есть несколько способов исправить это:

  • Вы можете использовать отсечение, чтобы вырезать нежелательные пиксели
  • Вы можете отключить сглаживание, а также изменять границы прямоугольника, чтобы убедиться, что ход, где вы хотите
  • Вы можете изменить путь к инсульту, так что имеет эффект 1/2 пикселя во внимание

Я хотел бы предложить свой рисунок инсульта на половине пикселя, который будет включать делать что-то л икэ это:

CGRectMake(rect.origin.x + 0.5, rect.origin.y + 0.5, rect.size.width - 1, rect.size.height - 1); 
+1

Вы также можете использовать 'CGPathCreateCopyByTransformingPath (путь, преобразование)' перевести полный путь (0.5, 0.5), если вы обнаружите, что легче работать с –

+0

Да, это, безусловно, проще, чем добавление +0.5 везде. – andyPaul

Смежные вопросы