iPhone:Wie zeichne ich Text in ein Fenster?
Frage
Seltsame Situation – Beispiele von Apple funktionieren, aber nachdem ich sie ein wenig geändert habe, wird kein Text angezeigt.Dieser Code zeichnet korrekt den blauen Hintergrund, weigert sich jedoch, Text darauf zu zeichnen, egal was ich tue:
#import <UIKit/UIKit.h>
@interface CWnd : UIWindow @end
@implementation CWnd
- (void) drawRect : (CGRect) i_poRect
{
// This is working : windows is blue.
CGContextRef oContex = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor( oContex, 0, 0, 255, 1 );
CGContextFillRect( oContex, i_poRect );
// This is not working : not text is displayed.
CGContextSelectFont( oContex, "Monaco", 10, kCGEncodingFontSpecific );
CGContextSetRGBStrokeColor( oContex, 255, 0, 0, 1 );
CGContextSetRGBFillColor( oContex, 255, 0, 0, 1 );
CGContextSetTextDrawingMode( oContex, kCGTextFill );
CGContextSetTextPosition( oContex, 100, 100 );
CGContextShowText( oContex, "abc", 3 );
}
@end
@interface CDelegate : NSObject <UIApplicationDelegate> @end
@implementation CDelegate
- (void)applicationDidFinishLaunching : (UIApplication *) i_poApp
{
CGRect oRect = [ [ UIScreen mainScreen ] bounds ];
[ [ [ CWnd alloc] initWithFrame : oRect ] makeKeyAndVisible ];
}
@end
int main(int argc, char *argv[])
{
return UIApplicationMain( argc, argv, nil, @"CDelegate" );
}
Lösung
Ich habe den folgenden Code problemlos verwendet, um Text direkt an einen Quarz-Kontext zu ziehen:
CGContextSetStrokeColorWithColor(context, strokeColor);
CGContextSetFillColorWithColor(context, strokeColor);
CGContextSelectFont(context, "Helvetica", fontSize, kCGEncodingMacRoman);
CGContextSetTextDrawingMode(context, kCGTextFill);
CGContextSetTextPosition(context, 0.0f, round(fontSize / 4.0f));
CGContextShowText(context, [text UTF8String], strlen([text UTF8String]));
Es ist nicht klar, was in Ihrem Fall falsch läuft. Es gibt zwei Dinge zu beachten gilt in diesem Fall: Der Text upside-down auf den Koordinatenraum blätterte durch ziehen kann aus UIViews und ihren CALayers und als rhythmische Fistman weist darauf hin, das nicht behandelt UTF-Codierungen
.Eine bessere, wenn auch weniger performant, Ansatz ist wie etwas zu tun:
CGContextSetFillColorWithColor(context, strokeColor);
[text drawAtPoint:CGPointMake(0.0f, 0.0f) withFont:[UIFont fontWithName:@"Helvetica" size:fontSize]];
Andere Tipps
Hey, ich habe gerade eine Notiz in meinem Code.
Offenbar CGContextShowTextAtPoint
nicht mit CGContextSetFont
arbeiten.
Sie müssen CGContextSelectFont
stattdessen verwenden. Offensichtliche, nicht wahr?
Wie auch immer, ich weiß das nicht der Fall ist, aber man könnte versuchen CGContextShowTextAtPoint
verwenden.
Dies ist wahrscheinlich gehört nicht in einer separaten Antwort.
Andere Personen ( hier und hier haben) einige Affintransformationen getan und verwendet, um die CGContextShowTextAtPoint
Methode, um Damit es funktioniert:
CGContextSelectFont(oContex, @"Monaco", 10, kCGEncodingFontSpecific);
CGContextSetTextDrawingMode(oContex, kCGTextFill);
CGContextSetRGBFillColor(oContex, 1.0, 0.0, 0.0, 1.0);
CGAffineTransform xform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
CGContextSetTextMatrix(oContex, xform);
CGContextShowTextAtPoint(oContex, 100, 100, "abc", 3);
Ein weiteres mögliches Problem ist, dass das Verfahren CGContextSetRGBFillColor
Gleitkommazahlen Argumente im Bereich von 0,0 bis 1,0 stattfindet. Sie verwenden 255 „Farben“, um anzuzeigen, das ist nicht, was das Verfahren erwartet. Folgendes sollte funktionieren, wenn Sie sich wohler mit dem 0-255 Bereich sind:
CGContextSetRGBFillColor(oContex, 255/255.0, 0/255.0, 0/255.0, 1.0);
Hey, könnte eine Codierung Problem sein.
Versuchen kCGEncodingFontSpecific
Wechsel zu kCGEncodingMacRoman
.
Wenn Sie später alles zum Laufen zu bringen, werde CGContextShowTextAtPoint
befreien.
Es ist Müll, Nicht-Unicode und die Glyphe-Versionen zu verwenden, die Sie benötigen, um
rufen verboten APIs. Du bist viel besser dran UIKit für Text Zeichnung verwenden.
Es ist Unicode-versierte und tut auch anständige Zeichenersetzung für Zeichen
, die nicht in Ihrer Schrift präsentieren.
Es gibt noch eine andere Möglichkeit: Die von Ihnen angegebene Textposition liegt außerhalb des Rechtecks, in dem Sie zeichnen möchten.Dies lässt sich leicht durch Ersetzen testen
CGContextSetTextPosition( oContex, 100, 100 );
mit
CGContextSetTextPosition( oContex, CGRectGetMidX(i_poRect), CGRectGetMidY(i_poRect));
CGContextSetTextMatrix Methode verwenden. Das "upside down Problem" ist, von der Matrix.