我一直在使用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/