我一直在使用NSStrokeWidthAttributeName对象在绘制文本时在文本周围放置大纲。问题是笔划在文本的填充区域内。当文本很小(例如1像素厚)时,笔划会使文本难以阅读。我真正想要的是在外面打一拳。有办法吗?
我试过一个没有偏移和模糊的NSAttributedString,但是太模糊了,很难看到。如果有一种方法可以增加阴影的大小而不产生任何模糊,那也可以。

最佳答案

虽然可能还有其他方法,但实现这一点的一种方法是,首先只用笔划绘制字符串,然后只用填充绘制字符串,直接超出先前绘制的内容。(Adobe InDead实际上有这个内置的,在这里它只会出现笔划到字母的外面,这有助于可读性)。
这只是一个示例视图,展示了如何实现这一点(灵感来自http://developer.apple.com/library/mac/#qa/qa2008/qa1531.html):
首先设置属性:

@implementation MDInDesignTextView

static NSMutableDictionary *regularAttributes = nil;
static NSMutableDictionary *indesignBackgroundAttributes = nil;
static NSMutableDictionary *indesignForegroundAttributes = nil;

- (void)drawRect:(NSRect)frame {
    NSString *string = @"Got stroke?";
    if (regularAttributes == nil) {
        regularAttributes = [[NSMutableDictionary
    dictionaryWithObjectsAndKeys:
        [NSFont systemFontOfSize:64.0],NSFontAttributeName,
        [NSColor whiteColor],NSForegroundColorAttributeName,
        [NSNumber numberWithFloat:-5.0],NSStrokeWidthAttributeName,
        [NSColor blackColor],NSStrokeColorAttributeName, nil] retain];
    }

    if (indesignBackgroundAttributes == nil) {
        indesignBackgroundAttributes = [[NSMutableDictionary
        dictionaryWithObjectsAndKeys:
        [NSFont systemFontOfSize:64.0],NSFontAttributeName,
        [NSNumber numberWithFloat:-5.0],NSStrokeWidthAttributeName,
        [NSColor blackColor],NSStrokeColorAttributeName, nil] retain];
    }

    if (indesignForegroundAttributes == nil) {
        indesignForegroundAttributes = [[NSMutableDictionary
        dictionaryWithObjectsAndKeys:
        [NSFont systemFontOfSize:64.0],NSFontAttributeName,
        [NSColor whiteColor],NSForegroundColorAttributeName, nil] retain];
    }

    [[NSColor grayColor] set];
    [NSBezierPath fillRect:frame];

    // draw top string
    [string drawAtPoint:
        NSMakePoint(frame.origin.x + 200.0, frame.origin.y + 200.0)
        withAttributes:regularAttributes];

    // draw bottom string in two passes
    [string drawAtPoint:
        NSMakePoint(frame.origin.x + 200.0, frame.origin.y + 140.0)
        withAttributes:indesignBackgroundAttributes];
    [string drawAtPoint:
        NSMakePoint(frame.origin.x + 200.0, frame.origin.y + 140.0)
        withAttributes:indesignForegroundAttributes];
}

@end

这将产生以下输出:
现在,它不是完美的,因为字形有时会落在分数边界上,但是它看起来比默认要好。
如果性能是一个问题,那么您总是可以考虑降低到稍低的级别,比如coregraphics或coretext。

关于objective-c - 您如何描画NSAttributedString的_outside_?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4467597/

10-12 04:27
查看更多