Как нарисовать заштрихованный и закрашенный текст в drawLayer: делегат inContext - PullRequest
3 голосов
/ 31 октября 2011

это мой метод drawLayer в делегате CALayer .

он отвечает только за рисование string with length = 1.

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 
    {
        CGRect boundingBox = CGContextGetClipBoundingBox(ctx);
        NSAttributedString *string = [[NSAttributedString alloc] initWithString:self.letter attributes:[self attrs]];

        CGContextSaveGState(ctx);

        CGContextSetShadowWithColor(ctx, CGSizeZero, 3.0, CGColorCreateGenericRGB(1.0, 1.0, 0.922, 1.0));
        CTLineRef line = CTLineCreateWithAttributedString((CFAttributedStringRef)string);
        CGRect rect = CTLineGetImageBounds(line, ctx);
        CGFloat xOffset = CGRectGetMidX(rect);
        CGFloat yOffset = CGRectGetMidY(rect);
        CGPoint pos = CGPointMake(CGRectGetMidX(boundingBox) - xOffset, CGRectGetMidY(boundingBox)- yOffset);
        CGContextSetTextPosition(ctx, pos.x, pos.y);

        CTLineDraw(line, ctx);

    CGContextRestoreGState(ctx);
}

вот словарь атрибутов:

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
[NSFont fontWithName:@"GillSans-Bold" size:72.0], NSFontAttributeName,
[NSColor blackColor], NSForegroundColorAttributeName,
[NSNumber numberWithFloat:1.0], NSStrokeWidthAttributeName,
[NSColor blackColor], NSStrokeColorAttributeName,
style, NSParagraphStyleAttributeName, nil];

как есть, штрих не рисуется, а заливка.

если я закомментирую атрибуты штриха в словаре, заливка будет.

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

это известная проблема при рисовании текста с делегатом?

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

1 Ответ

3 голосов
/ 31 октября 2011

в чтении ответ на этот вопрос, я понял, что мне нужно было использовать negative number для значения хода. я думал о мазке, который применяется к вне буквы, нарисованной CTLineDraw, а не внутри текстовой формы.

Я отвечаю на свой вопрос, на случай, если это поможет кому-то еще с этим недоразумением, так как я не видел ссылочный документ , охватывающий это.

...