Dear Graham, dear Alex, dear Will, thanks a lot for your helpful suggestions.
So far, I have written this code as a replacement for CGContextSelectFont(). I am putting it here for the record (i.e., Google's archives). But if anyone could suggest modifications to make it better (e.g., remove a bug, make it simpler, or more future proof), I will greatly appreciate it. Best regards, Gabriel. @implementation TextLayerDelegate - (void) drawLayer: (CALayer *) theLayer inContext: (CGContextRef) ctxt { NSMutableString * mesg; // fill mesg // create font NSDictionary *fontAttributes = [NSDictionary dictionaryWithObjectsAndKeys: @"Andale Mono", (NSString *) kCTFontFamilyNameAttribute, @"Regular", (NSString *) kCTFontStyleNameAttribute, [NSNumber numberWithFloat: 16.0], (NSString *) kCTFontSizeAttribute, nil ]; // kCTFontStyleNameAttribute variants could be "Bold" "Semi-Bold" -- check in FontBook CTFontDescriptorRef descriptor = CTFontDescriptorCreateWithAttributes( (CFDictionaryRef) fontAttributes ); CTFontRef font = CTFontCreateWithFontDescriptor( descriptor, 0.0, NULL ); CFRelease( descriptor ); // create an attributed string CGColorRef textcolor = CGColorCreateGenericRGB( 0.2, 0.2, 0.2, 1.0 ); // color of the "shadow" CFMutableDictionaryRef attributes = CFDictionaryCreateMutable( kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks ); CFDictionaryAddValue( attributes, kCTFontAttributeName, font ); CFDictionaryAddValue( attributes, kCTForegroundColorAttributeName, textcolor ); CFAttributedStringRef attrString = CFAttributedStringCreate( kCFAllocatorDefault, (CFStringRef)mesg, attributes ); // offset from bottom left corner float offset = 7.0f; if ( theLayer.bounds.size.height > 900 ) offset = 15.0f; // draw the string as one line CTLineRef line = CTLineCreateWithAttributedString( attrString ); CGContextSetTextPosition( ctxt, theLayer.bounds.origin.x + offset, theLayer.bounds.origin.y + offset ); CTLineDraw( line, ctxt ); // draw it again on top of it, with another color CFRelease( textcolor ); textcolor = CGColorCreateGenericRGB( 1.0, 1.0, 1.0, 1.0 ); // color of the foreground text CFDictionaryReplaceValue( attributes, kCTForegroundColorAttributeName, textcolor ); CFRelease( attrString ); attrString = CFAttributedStringCreate( kCFAllocatorDefault, (CFStringRef)mesg, attributes ); CFRelease( line ); line = CTLineCreateWithAttributedString( attrString ); CGContextSetTextPosition( ctxt, theLayer.bounds.origin.x + offset + 3, theLayer.bounds.origin.y + offset + 3 ); CTLineDraw( line, ctxt ); // release everything that was constructed by a function that has "Create" or "Copy" in it CFRelease( attributes ); CFRelease( line ); CFRelease( attrString ); CFRelease( font ); CFRelease( textcolor ); [mesg release]; } // this function gets called byway of the following in the main: textLayer_ = [CALayer layer]; TextLayerDelegate * textlayer_delegate = [[TextLayerDelegate alloc] initWith: self]; // ... set up this layer [textLayer_ setNeedsDisplay]; [mainLayer_ addSublayer: textLayer_ ]; _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com