2009-06-09 10 views
7

Ich versuche herauszufinden, was ich hier falsch mache. Habe mehrere Dinge ausprobiert, aber ich sehe dieses schwer fassbare Rechteck nie auf dem Bildschirm. Im Moment möchte ich nur ein einzelnes Rechteck auf dem Bildschirm zeichnen.Anfänger iphone Frage: Zeichnen eines Rechtecks. Was mache ich falsch?

Ich bekomme einen "ungültigen Kontext" für alles außer dem CGContextSetRGBFillColor(). Den Kontext danach zu finden, scheint mir etwas falsch zu sein, aber ich bin nicht zu Hause und schaue mir die Beispiele an, die ich letzte Nacht benutzt habe.

Habe ich noch etwas anderes vermasselt? Ich möchte wirklich zumindest so viel getan heute Abend bekommen ...

- (id)initWithCoder:(NSCoder *)coder 
{ 
    CGRect myRect; 
    CGPoint myPoint; 
    CGSize mySize; 
    CGContextRef context; 

    if((self = [super initWithCoder:coder])) { 
    NSLog(@"1"); 
    currentColor = [UIColor redColor]; 
    myPoint.x = (CGFloat)100; 
    myPoint.y = (CGFloat)100; 
    mySize.width = (CGFloat)50; 
    mySize.height = (CGFloat)50; 
    NSLog(@"2"); 
    // UIGraphicsPushContext (context); 
    NSLog(@"3"); 
    CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0); 
    context = UIGraphicsGetCurrentContext(); 
    CGContextSetFillColorWithColor(context, currentColor.CGColor); 
    CGContextAddRect(context, myRect); 
    CGContextFillRect(context, myRect); 
    } 

    return self; 

} 

Danke,

Sean.

Antwort

9

Sie dürfen den CG-Code nicht in initWithCoder setzen. Diese Nachricht sollte nur für INITIALIZATION Zwecke verwendet werden.

Setzen Sie Ihren Zeichencode in:

- (void)drawRect:(CGRect)rect 

Wenn Sie eine UIView sind Subklassen ...

+12

Auch sollten Sie drawRect nicht direkt aufrufen, sondern stattdessen setNeedsDisplay aufrufen, damit das OS es aufnimmt und die Ansicht später neu zeichnet. – pgb

+0

Ja. Stimmt. –

+0

Okay, also sollte ich initWithCoder() nicht zum Zeichnen von Sachen verwenden. Aber beantwortet das tatsächlich meine Frage? Bewegt sich der CG-Code zu einer anderen Funktion, die einen Unterschied macht, ob das Rechteck gezeichnet wird oder nicht? Und für die Verwendung/nicht mit DrawRect, haben Sie es jetzt geschafft, mich zu verwirren. Willst du damit sagen, dass ich alle Parameter für mein Rechteck in drawRect setzen soll? Das scheint auch nicht richtig zu sein - was, wenn ich mehr als ein Rechteck zeichnen möchte? Wenn es eine einfache Beispielanwendung gibt, die * nur * ein Rechteck oder einen Kreis zeichnet, würde ich mir das mal ansehen. Sean. –

40

mit einer View-basierten Vorlage starten, erstellen Sie ein Projekt mit dem Namen Schublade. Fügen Sie Ihrem Projekt eine UIView-Klasse hinzu. Nennen Sie es SquareView (.h und .m).

Doppelklick DrawerViewController.xib es in Interface Builder zu öffnen. Ändern Sie die allgemeine Ansicht dort in SquareView im Identity Inspector (Befehl-4) mit dem Class Popup-Menü. Speichern und gehen Sie zurück zu Xcode.

diesen Code in den drawRect Put:

- (void)drawRect:(CGRect)rect; 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBStrokeColor(context, 1.0, 1.0, 0.0, 1.0); // yellow line 

    CGContextBeginPath(context); 

    CGContextMoveToPoint(context, 50.0, 50.0); //start point 
    CGContextAddLineToPoint(context, 250.0, 100.0); 
    CGContextAddLineToPoint(context, 250.0, 350.0); 
    CGContextAddLineToPoint(context, 50.0, 350.0); // end path 

    CGContextClosePath(context); // close path 

    CGContextSetLineWidth(context, 8.0); // this is set from now on until you explicitly change it 

    CGContextStrokePath(context); // do actual stroking 

    CGContextSetRGBFillColor(context, 0.0, 1.0, 0.0, 0.5); // green color, half transparent 
    CGContextFillRect(context, CGRectMake(20.0, 250.0, 128.0, 128.0)); // a square at the bottom left-hand corner 
} 

Sie nicht tun: Methode Ihrer SquareView.m Datei ein großes, schiefes, leeres gelbes Rechteck und ein kleines, grün, transparent Quadrat zu zeichnen muss diese Methode aufrufen, damit die Zeichnung passiert. Ihr View-Controller teilt der Ansicht mit, dass sie sich mindestens einmal selbst zeichnen soll, wenn das Programm startet und die NIB-Dateien aktiviert werden.