在仿射变换上扩展iPhone“基于矢量的图形”

时间:2010-01-30 15:48:19

标签: iphone vector core-graphics quartz-graphics

我用这个drawRect

制作了一个“圆圈”视图
- (void)drawRect:(CGRect)rect 
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(ctx, color.CGColor);
    CGContextAddEllipseInRect(ctx, rect);
    CGContextFillPath(ctx);
}

当我尝试使用CGAffineTransformMakeScale(2.0, 2.0)缩放视图时,结果在边缘上模糊且像素化。但是,编程指南说Quartz使用基于矢量的命令来绘制视图,并且在使用仿射变换时它们会继续看起来很好:

  

Quartz绘图系统使用基于矢量的绘图模型。与基于光栅的绘图模型相比,绘图命令对各个像素进行操作,Quartz中的绘图命令使用固定比例绘图空间(称为用户坐标空间)指定。然后,iPhone OS将此绘图空间中的坐标映射到设备的实际像素上。 此模型的优势在于,使用矢量命令绘制的图形在使用仿射变换放大或缩小时仍然看起来很好

或者我不使用基于矢量的命令?如果没有,我该怎么做才能画圆圈?

感谢。

3 个答案:

答案 0 :(得分:5)

将变换应用于视图不会导致重绘。它所做的就是缩放视图的图层,这是存储在GPU上的位图纹理。这将导致图形模糊。

在iPhone上绘制视图时,会调用-drawRect:来提供视图图层的内容。然后将该内容缓存为GPU上的纹理。

他们在指南中指的是在绘制矢量图形时,在-drawRect:期间应用变换。如果你在那里使用变换(通过CGContextConcatCTM()等),圆圈将以更大的比例平滑地绘制。但是,您还需要调整视图大小以反映这个更大的形状。我建议在自定义视图子类上使用scale属性,您可以将其设置为不同的比例因子,并且可以处理调整视图大小并重新绘制其内容的大小。

答案 1 :(得分:0)

这取决于您应用缩放转换时,我希望。如果先绘制它,然后进行缩放变换,那么它将看起来像素化(因为它在绘制后已经缩放)。如果在执行绘图例程之前执行了缩放,我希望它能按预期工作。

所以是的,您正在使用基于矢量的命令来实现这一目标;我怀疑这是一个订购问题。你什么时候进行转换和绘图?

答案 2 :(得分:0)

您可以尝试在转换后调用setNeedsDisplay,我不确定这是否有效,但值得一试。