Рисуване в контекст на растерно изображение

Опитвам се да нарисувам контекст на растерно изображение, но излизам празен. Вярвам, че създавам нещата правилно, защото мога да инициализирам контекста, да нарисувам няколко неща, след това да създам изображение от него и да нарисувам това изображение. Това, което не мога да направя, е след инициализацията да задействам по-нататъшно рисуване върху контекста, което рисува повече елементи върху него. Не съм сигурен дали пропускам някаква обичайна практика, която предполага, че мога да го нарисувам само на определени места или че трябва да направя нещо друго. Ето какво правя по-долу.

Копирах помощната функция, предоставена от Apple, с една модификация, за да получа цветовото пространство, защото не се компилира (това е за 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
}

Инициализирам го в моя init метод по-долу с няколко примерни рисунки, само за да съм сигурен, че изглежда правилно:

    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 създавам изображение от него, за да го изобразя. Може би трябва да създавам и запазвам това изображение като променлива член и да го актуализирам всеки път, когато нарисувам нещо ново, а не да създавам изображението на всеки кадър? (Някои съвети по този въпрос биха били добри):

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

Помогне?


person Joey    schedule 15.10.2010    source източник


Отговори (1)


[self setNeedsDisplay]; !!!!

!!!!!!!!!

така беше, защото drawRect никога не беше извикан след init, тъй като не знаеше, че има нужда от опресняване. Моето разбиране е, че трябва просто да извикам setNeedsDisplay всеки път, когато рисувам и това изглежда работи. :)

person Joey    schedule 15.10.2010