我的颜色位图在drawRect(iPhone)中只有黑白

时间:2010-07-31 07:49:43

标签: iphone objective-c

我想在drawRect中保留以前的绘图(系统每次都清除它),似乎要采用的是位图上下文,当然,这样做除了现在我的颜色消失了只留下黑色而不是白色。

这是我的“静态”背景

-(id)initWithCoder:(NSCoder *)aDecoder {
...
 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
 contextRef = CGBitmapContextCreate(NULL, 
            320, 
            640, 
            8, 
            320*4, 
            colorSpace, 
            kCGImageAlphaPremultipliedLast);
...
}

这是我的替代背景:

-(void)drawRect:(CGRect)rect {
        myDrawRoutine();

 CGContextRef context = UIGraphicsGetCurrentContext();

 CGContextDrawImage(context, rect, CGBitmapContextCreateImage(contextRef));

}

这是抽奖例程的胆量:

...
// CGContextRef context = UIGraphicsGetCurrentContext();
 CGContextRef context = contextRef;
 if( !(context) )
  return;

 CGContextSetFillColor(context, CGColorGetComponents([co CGColor]));
 CGContextSetStrokeColor(context, CGColorGetComponents([co CGColor]));

 CGContextFillEllipseInRect(context, CGRectMake((*i)->x,
               (*i)->y, 
               (*i)->diam,
               (*i)->diam));
...
}

2 个答案:

答案 0 :(得分:0)

感谢tonclon

这让速度有所提高:)

但它仍然用黑白绘制:(

以上是上述代码+修改......

这是我的“静态背景”:

    -(id)initWithCoder:(NSCoder *)aDecoder {
    ...
    }
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    contextRef = CGBitmapContextCreate(NULL, 
                    320, 
                    640, 
                    8, 
                    320*4, 
                    colorSpace, 
                    kCGImageAlphaPremultipliedLast);
    CGColorSpaceRelease(colorSpace);

    cglayer = CGLayerCreateWithContext(contextRef, CGSizeMake(320.0f, 640.0f), NULL);
    contextRef = CGLayerGetContext(cglayer);
    ...
    }

这是我的“替换上下文”,即改为使用cglayer(不再替换上下文)。

-(void)drawRect:(CGRect)rect {
    for(std::vector<Body*>::iterator i = bodyVec.begin(); i < bodyVec.end(); ++i)
        move(i);

    CGContextRef context = UIGraphicsGetCurrentContext();

//  CGContextDrawImage(context, rect, CGBitmapContextCreateImage(contextRef));
    CGContextDrawLayerInRect(context, rect, cglayer);

}

(“抽象例程的胆量”保持不变。)

答案 1 :(得分:0)

最后!感谢这个帖子 Extracting rgb from UIColor

我得到了答案 - 使用CGContextSetRGBFillColor代替,然后间接地用CGColorGetComponents中的RGB提供它。

CGColorRef color = [co CGColor];    
int numComponents = CGColorGetNumberOfComponents(color);
CGFloat red;
CGFloat green;
CGFloat blue;
CGFloat alpha;
if (numComponents == 4)
{
    const CGFloat *components = CGColorGetComponents(color);
    red = components[0];
    green = components[1];
    blue = components[2];
    alpha = components[3];
}

//  CGContextSetFillColor(context, CGColorGetComponents([co CGColor]));
//  CGContextSetStrokeColor(context, CGColorGetComponents([co CGColor]));
CGContextSetRGBFillColor(context, red, green, blue, alpha);
CGContextSetRGBStrokeColor(context, red, green, blue, alpha);

CGContextFillEllipseInRect(context, CGRectMake((*i)->x,
                                               (*i)->y, 
                                               (*i)->diam,
                                               (*i)->diam));
}