2010-10-15 6 views
3

Я пытаюсь рисовать в контекст растрового изображения, но при этом пуст. Я считаю, что правильно создаю вещи, потому что я могу инициализировать контекст, нарисовать несколько вещей, а затем создать изображение из него и нарисовать это изображение. То, что я не могу сделать, после инициализации, еще раз нарисовать контекст, который рисует больше элементов на нем. Я не уверен, что я пропустил какую-то обычную практику, которая подразумевает, что я могу только нарисовать ее в определенных местах или что я должен сделать что-то еще. Вот что я делаю, ниже.Рисование в контексте растрового изображения

Я скопировал вспомогательную функцию, представленную яблока с одной модификацией, чтобы получить цветовое пространство, потому что не компиляции (это для IPad, не знаю, если это имеет значение):

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 
} 

инициализирую это в моем методе инициализации ниже с несколькими образца рисует просто чтобы быть уверенным, что выглядит правильно:

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

в моем методе DrawRect я создаю образ из него, чтобы сделать это. Может быть, я должен создавать и сохранять это изображение в качестве члена var и обновлять его каждый раз, когда я рисую что-то новое, а не создавая изображение в каждом кадре? (Некоторые советы по этому вопросу было бы неплохо):

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

Тогда как тест я пытаюсь рисовать круг, когда я прикасаюсь, но ничего не происходит, и прикосновение, безусловно, инициирующего:

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

Помощь?

ответ

1

[self setNeedsDisplay]; !!!!

!!!!!!!!!

так было потому, что drawRect никогда не вызывался после init, так как он не знал, что ему нужно обновить. Я понимаю, что я должен просто вызвать setNeedsDisplay в любое время, когда я рисую, и это, похоже, работает. :)

+0

Вы можете «принять» свой собственный ответ, нажав зеленую галочку ... –

Смежные вопросы