2010-10-15 5 views
3

J'essaie de dessiner dans un contexte bitmap, mais à venir vide. Je crois que je crée des choses correctement parce que je peux initialiser le contexte, dessiner quelques choses, puis en créer une image et dessiner cette image. Ce que je ne peux pas faire est, après l'initialisation, déclencher un dessin supplémentaire sur le contexte qui attire plus d'éléments dessus. Je ne suis pas sûr si je manque une pratique courante qui implique que je peux seulement dessiner à certains endroits ou que je dois faire autre chose. Voici ce que je fais, ci-dessous.Dessiner dans un contexte bitmap

j'ai copié la fonction d'assistance fourni par Apple avec une modification pour obtenir l'espace de couleur, car il n'a pas été compilait (ce qui est pour iPad, ne sais pas si cela importe):

CGContextRef MyCreateBitmapContext (int pixelsWide, int pixelsHigh) 
{ 
    CGContextRef context = NULL; 
    CGColorSpaceRef colorSpace; 
    void *   bitmapData; 
    int    bitmapByteCount; 
    int    bitmapBytesPerRow; 

    bitmapBytesPerRow = (pixelsWide * 4);// 1 
    bitmapByteCount  = (bitmapBytesPerRow * pixelsHigh); 


    colorSpace = CGColorSpaceCreateDeviceRGB(); //CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);// 2 

    bitmapData = malloc(bitmapByteCount);// 3 
    if (bitmapData == NULL) 
    { 
     fprintf (stderr, "Memory not allocated!"); 
     return NULL; 
    } 
    context = CGBitmapContextCreate (bitmapData,// 4 
            pixelsWide, 
            pixelsHigh, 
            8,  // bits per component 
            bitmapBytesPerRow, 
            colorSpace, 
            kCGImageAlphaPremultipliedLast); 
    if (context== NULL) 
    { 
     free (bitmapData);// 5 
     fprintf (stderr, "Context not created!"); 
     return NULL; 
    } 
    CGColorSpaceRelease(colorSpace);// 6 

    return context;// 7 
} 

J'initialiser dans ma méthode init ci-dessous avec quelques échantillons tire juste pour être sûr qu'il ressemble à droite:

mContext = MyCreateBitmapContext (rect.size.width, rect.size.height); 

    // sample fills 
    CGContextSetRGBFillColor (mContext, 1, 0, 0, 1); 
    CGContextFillRect (mContext, CGRectMake (0, 0, 200, 100)); 
    CGContextSetRGBFillColor (mContext, 0, 0, 1, .5); 
    CGContextFillRect (mContext, CGRectMake (0, 0, 100, 200)); 


    CGContextSetRGBStrokeColor(mContext, 1.0, 1.0, 1.0, 1.0); 
    CGContextSetRGBFillColor(mContext, 0.0, 0.0, 1.0, 1.0); 
    CGContextSetLineWidth(mContext, 5.0); 
    CGContextAddEllipseInRect(mContext, CGRectMake(0, 0, 60.0, 60.0)); 
    CGContextStrokePath(mContext); 

dans ma méthode de drawRect, je crée une image de celui-ci pour le rendre. Peut-être devrais-je créer et conserver cette image en tant que membre var et la mettre à jour chaque fois que je dessine quelque chose de nouveau et ne crée pas l'image à chaque image? (Quelques conseils sur ce serait bien):

// draw bitmap context 
CGImageRef myImage = CGBitmapContextCreateImage (mContext); 
CGContextDrawImage(context, rect, myImage); 
CGImageRelease(myImage); 

Puis, comme un test, j'essayer de dessiner un cercle quand je touche, mais rien ne se passe, et la touche déclenche sans aucun doute:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGPoint location; 
    for (UITouch* touch in touches) 
    { 
     location = [touch locationInView: [touch view]]; 
    } 
    CGContextSetRGBStrokeColor(mContext, 1.0, 1.0, 1.0, 1.0); 
    CGContextSetRGBFillColor(mContext, 0.0, 0.0, 1.0, 1.0); 
    CGContextSetLineWidth(mContext, 2.0); 
    CGContextAddEllipseInRect(mContext, CGRectMake(location.x, location.y, 60.0, 60.0)); 
    CGContextStrokePath(mContext); 
} 

aide?

Répondre

1

[self setNeedsDisplay]; !!!!

!!!!!!!!! C'est parce que drawRect n'a jamais été appelé après init, car il ne savait pas qu'il devait être actualisé. Ma compréhension est que je devrais appeler setNeedsDisplay à chaque fois que je dessine et cela semble fonctionner. :)

+0

Vous pouvez "accepter" votre propre réponse en cliquant sur la coche verte ... –

Questions connexes