2009-06-09 10 views
7

Cercando di capire cosa sto facendo male qui. Ho provato diverse cose, ma non ho mai visto quel rettangolo sfuggente sullo schermo. In questo momento, è tutto ciò che voglio fare: basta disegnare un singolo rettangolo sullo schermo.Domanda iphone per principianti: disegno di un rettangolo. Che cosa sto facendo di sbagliato?

Ricevo un "contesto non valido" su tutto tranne CGContextSetRGBFillColor(). Ottenere il contesto dopo mi sembra un po 'sbagliato, ma non sono a casa a guardare gli esempi che stavo usando la notte scorsa.

Ho incasinato qualcos'altro? Mi piacerebbe davvero ottenere almeno questa sera molto fatto ...

- (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; 

} 

Grazie,

Sean.

risposta

9

Non è necessario inserire il codice CG in initWithCoder. Quel messaggio dovrebbe essere usato solo per lo scopo di INIZIALIZZAZIONE.

inserire il codice di disegno in:

- (void)drawRect:(CGRect)rect 

Se si sottoclasse un UIView ...

+12

Inoltre, non chiamare direttamente drawRect, ma chiamare setNeedsDisplay, in modo che il sistema operativo lo prelevi e ridisegni la vista in un secondo momento. – pgb

+0

Sì. Giusto. –

+0

Ok, quindi non dovrei usare initWithCoder() per disegnare cose. Ma in realtà risponde alla mia domanda? Lo spostamento del codice CG su un'altra funzione può fare la differenza se il rettangolo viene disegnato o meno? E per quanto riguarda l'utilizzo/non utilizzo di drawRect, ora sei riuscito a confondermi. Stai dicendo che dovrei mettere tutti i parametri per il mio rettangolo in drawRect? Neanche questo sembra giusto, e se volessi disegnare più di un rettangolo? Se esiste una semplice app di esempio che * semplicemente * disegna un rettangolo o un cerchio o qualcosa del genere, vorrei dargli un'occhiata. Sean. –

40

Partendo da un modello di vista-based, creare un progetto denominato cassetto. Aggiungi una classe UIView al tuo progetto. Denominalo SquareView (.h e .m).

doppio clic DrawerViewController.xib per aprirlo in Interface Builder. Modificare la visualizzazione generica in SquareView in Identity Inspector (comando-4) utilizzando il menu a comparsa Classe. Salva e torna a Xcode.

inserire questo codice nel drawRect: il metodo del file SquareView.m per disegnare un grande, storto, rettangolo vuoto giallo e un piccolo, verde, quadrato trasparente:

- (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 
} 

Non lo sai chiamare questo metodo perché il disegno si verifichi. Il controller della vista indicherà alla vista di disegnarsi almeno una volta all'avvio del programma e all'attivazione dei file NIB.