我想在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));
...
}
答案 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));
}