Re: stringWithFormat / Rendering Text (iOS)
Re: stringWithFormat / Rendering Text (iOS)
- Subject: Re: stringWithFormat / Rendering Text (iOS)
- From: glenn andreas <email@hidden>
- Date: Thu, 24 May 2012 10:27:42 -0500
On May 24, 2012, at 9:36 AM, Manfred Schwind wrote:
>> CGContextShowTextAtPoint(contextRef, 0, 40,
>> [textToDraw UTF8String], [textToDraw length]);
>
> One bug I see here: you're passing a wrong length parameter.
> CGContextShowTextAtPoint expects the length of the char array (number of bytes of the UTF-8 encoded string), but you'e passing the number of Unicode characters in the string. That's not the same; one character may be represented by multiple chars in UTF-8 encoding.
>
> E.g. use it this way:
>
> const char *myUTF8String = [textToDraw UTF8String];
> CGContextShowTextAtPoint(contextRef, 0, 40,
> myUTF8String, strlen(myUTF8String));
>
Also, CGContextShowTextAtPoint is designed only to display text in MacRoman encoding (and a corresponding font that has MacRoman character data tables).
If the string has anything other than ASCII text, the UTF8String won't be in MacRoman (and in general, MacRoman is a very small subset of what Unicode supports, so even if you got the string in MacRoman encoding, there is a very good chance it still won't draw correctly because somebody used a character outside of MacRoman).
From the docs:
> If setting the font to a MacRoman text encoding is sufficient for your application, use the CGContextSelectFont function. Then, when you are ready to draw the text, you call the function CGContextShowTextAtPoint. The function CGContextSelectFont takes as parameters a graphics context, the PostScript name of the font to set, the size of the font (in user space units), and a text encoding.
>
> To set the font to a text encoding other than MacRoman, you can use the functions CGContextSetFont and CGContextSetFontSize. You must supply a CGFont object to the function CGContextSetFont. You call the function CGFontCreateWithPlatformFont to obtain a CGFont object from an ATS font. When you are ready to draw the text, you use the function CGContextShowGlyphsAtPoint rather thanCGContextShowTextAtPoint.
>
So for general case drawing, you'll need to generate glyphs from the text, which is an extremely complicated procedure to do without some sort of type-setter support (such as found in CoreText or (not available on iOS) NSTypesetter).
Basically, CGContextShowTextAtPoint is designed to show simple debugging information and very limited/controlled strings, not a general purpose drawing routine.
Just use NSString's drawAtPoint:withFont: and the like...
Glenn Andreas email@hidden
The most merciful thing in the world ... is the inability of the human mind to correlate all its contents - HPL
_______________________________________________
Cocoa-dev mailing list (email@hidden)
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:
This email sent to email@hidden