Рисование в растровом контексте - PullRequest
3 голосов
/ 16 октября 2010

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

Я скопировал вспомогательную функцию, предоставленную яблоком, с одной модификацией, чтобы получить цветовое пространство, потому что оно не компилировалось (это для 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 Ответ

1 голос
/ 16 октября 2010

[self setNeedsDisplay]; !!!!

!!!!!!!!!

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

...