Aunque puede haber otras formas, una forma de lograr esto es dibujar primero la cuerda con solo un trazo, luego dibujar la cuerda con solo un relleno, directamente sobrepasado de lo que se dibujó previamente. (Adobe InDesign tiene esto incorporado, donde parecerá que solo aplicará el trazo al exterior de la letra, lo que ayuda a la legibilidad).
Esto es sólo una vista de ejemplo que muestra cómo lograr esto (inspirado en http://developer.apple.com/library/mac/#qa/qa2008/qa1531.html):
Primero configurar los atributos:
@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
Esto produce el siguiente resultado:
Ahora, no es perfecto, ya que los glifos a veces caen en límites fraccionarios, pero, sin duda se ve mejor que el predeterminado.
Si el rendimiento es un problema, siempre se puede considerar bajar a un nivel ligeramente inferior, como CoreGraphics o CoreText.
Gracias. Funciona un placer –
Respuesta excelente y detallada. Gracias por poner el tiempo! – epologee
Simple. Brillante. ... y debería ser completamente innecesario ... (el soporte ya debería existir para esto) – u2Fan