Инсульт применяется как к тексту, так и к тени - PullRequest
2 голосов
/ 22 марта 2012

Я пытаюсь просто нарисовать текст с обводкой, а затем применить тень, но обводка применяется для тени.Как мне предотвратить это?

Notice stroke is applied to drop shadow

// Setup context
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);

// draw photo into context
CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage);
// Set Text Font
CGContextSelectFont(context, font.fontName.UTF8String, fontSize, kCGEncodingMacRoman);

// Set Text Drawing Mode
CGContextSetTextDrawingMode(context, kCGTextFillStroke);

// Set text fill color
CGColorRef tmpColor = color.CGColor;
CGFloat newComponents[4] = {};
memcpy(newComponents, CGColorGetComponents(tmpColor), sizeof(newComponents));
CGContextSetRGBFillColor(context, newComponents[0], newComponents[1], newComponents[2], newComponents[3]);

// Calculate Height
UIFont *testFont = [UIFont fontWithName:font.fontName size:fontSize];
CGSize size = [text sizeWithFont:testFont];

// Setup Font Shadow
CGSize shadowSize = CGSizeMake(6, 6);
CGContextSetShadowWithColor(context, shadowSize, 1.0, [[UIColor darkGrayColor] CGColor]);

// Set Stroke Color
CGContextSetRGBStrokeColor(context, 0, 255, 0, 1);
CGContextSetLineWidth(context, 2.0);

// draw text at location centered based on width.
CGContextShowTextAtPoint(context, (w / 2) - (textWidth / 2), h - size.height, ctext, strlen(ctext));

// Render Bitmap
CGImageRef imageMasked = CGBitmapContextCreateImage(context);
UIImage *returnImage = [UIImage imageWithCGImage:imageMasked];

1 Ответ

2 голосов
/ 22 марта 2012

Поскольку ваш режим рисования текста kCGTextFillStroke, CGContextShowTextAtPoint сначала рисует заливку (и создает для нее тень), а затем рисует обводку (которая получает собственную тень).

Чтобы исправить это, используйте слой прозрачности .

Обратите внимание, что он будет рисоваться намного быстрее, если вы используете CGContextBeginTransparencyLayerWithRect() и передаете как можно меньше прямоугольника..

В качестве альтернативы: если это достаточно хорошее приближение, вы можете рассмотреть возможность рисования текста в два этапа:

  1. заливка с тенью
  2. обводка без тени

Если ваш ход небольшой, разница будет не очень ощутимой, и она будет рисоваться значительно быстрее.

...