【问题标题】:Scaling up iPhone "vector-based graphics" on affine transforms在仿射变换上放大 iPhone“基于矢量的图形”
【发布时间】:2010-01-31 07:45:07
【问题描述】:

我用这个 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 然后将这个绘图空间中的坐标映射到设备的实际像素上。 此模型的优点是使用矢量命令绘制的图形在使用仿射变换放大或缩小时仍然看起来不错

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

谢谢。

【问题讨论】:

    标签: iphone vector core-graphics quartz-graphics


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的回复。据我所知,进行转换会使视图在之后重新绘制自身。但是我还是尝试了,在变换之后做了一个 [circle setNeedsDisplay] 并且它没有改变任何东西,也没有在绘制之前设置变换。
      • 绘制后更改变换矩阵不会影响您已经绘制的内容。图形状态不是那样工作的。不过,我仍然希望看到其中包含 CTM 更改语句的代码。
      • 正确 - 这就是问题所在。我尝试在 drawRect 方法中调用 self.transform = CGAffineTransformMakeScale(2.0, 2.0) 。布拉德的回应解释了这一点。
      【解决方案3】:

      您可以尝试在转换后拨打setNeedsDisplay,我不确定这是否可行,但值得一试。

      【讨论】:

      • 不,不会改变任何东西。
      猜你喜欢
      • 1970-01-01
      • 2013-02-14
      • 2014-09-28
      • 1970-01-01
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 2011-10-04
      相关资源
      最近更新 更多