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" );
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top