0

我需要沿着图像的形状绘制一条路径,使其始终匹配其在图像上的位置,而与图像比例无关。可以将其想象为谷歌地图的混合视图,其中街道名称和道路叠加在航拍图片之上。

此外,这条路径将由用户的手指移动绘制,我需要能够检索图像像素坐标上的路径关键点。用户放大以便更精确地设置路径位置。

我设法以某种方式使用这种方法使其工作:

- 创建一个名为 CanvasView 的自定义 UIView,它处理触摸交互并将缩放、旋转、平移值传递给 UIImageView 或 PathsView(见下文),具体取决于一个标志:deliverToImageOrPaths。

- 创建一个 UIImageView 保存基本图像。这被设置为 CanvasView 的子项

- 创建一个名为 PathsView 的自定义 UIView,它跟踪 2D 路径几何并使用自定义 drawRect 绘制自身。这被设置为 UIImageView 的子项。

所以层次结构:CanvasView -> UIImageView ->PathsView

这样,当 DeliverToImageOrPaths 为 YES 时,手指手势会同时转换 UIImageView 及其子 PathsView。当 deliverToImageOrPaths 为 NO 时,手势仅影响 PathsView 更改其几何形状。到目前为止,一切都很好。

问题:我遇到的问题是,当缩放基本 UIImageView(通过其 .transform 属性)时,PathsView 会使用锯齿伪影进行缩放。drawRect 仍在 PathsView 上被调用,但我猜它正在使用原始缓冲区大小执行绘图,然后进行插值。

我该如何解决这个问题?有没有更好的方法来实现这些功能?

PS:我尝试将PathsView图层类改为CATiledLayer,levelsOfDetailBias 4和levelsOfDetail 4。它在一定程度上解决了锯齿问题,但渲染速度慢得让人无法接受。

4

2 回答 2

0

如果您的目标是 iPhone OS 3.0+,您可以使用 aCAShapeLayer作为您的路径。您将 CGPathRef 分配给图层,它将为您处理所有绘图和缩放。您只需设置图层的变换。

于 2009-10-30T00:06:36.267 回答
0

如果您在绘制路径值时保留它们,则可以捕获基础图像的 % 缩放比例,然后重新定位路径值并在 PathsView 的 drawRect 方法中重新绘制它们。

这将涉及一些数学运算(主要是沿着地图投影线),但不是缩放位图和获取伪影,而是缩放点距离并使用矢量重绘,这将使其在任何分辨率下都平滑(尤其是如果你是用贝塞尔曲线而不是像素或线条连接点)。

如果您在用户绘制路径时沿路径绘制并丢弃点数据,那么唯一的解决方案是进行位图抗锯齿,这本质上是 CATiledLayer 为您所做的,正如您所发现的那样,可以减缓。

于 2009-10-02T23:33:55.963 回答