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

Dan*_*Dan 5 iphone vector core-graphics quartz-graphics

我用这个drawRect做了一个"圆圈"视图

- (void)drawRect:(CGRect)rect 
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(ctx, color.CGColor);
    CGContextAddEllipseInRect(ctx, rect);
    CGContextFillPath(ctx);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢.

Bra*_*son 5

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

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

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