在UIImage上覆盖2D路径而不缩放工件

时间:2009-10-02 21:26:59

标签: iphone uiimageview scaling path aliasing

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

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

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

创建一个名为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会使用锯齿工件进行缩放。仍然在PathsView上调用drawRect,但我猜它正在使用原始缓冲区大小执行绘图,然后进行插值。

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

PS:我尝试使用levelsOfDetailBias 4和levelsOfDetail 4将PathsView图层类更改为CATiledLayer。它在某种程度上解决了锯齿问题,但渲染速度慢,这是不可接受的。

2 个答案:

答案 0 :(得分:0)

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

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

如果你在用户绘制它们并丢弃点数据时沿着路径铺设颜料,那么唯一的解决方案就是进行位图消除锯齿,这实质上就是CATiledLayer正在为你做的事情,正如你所发现的那样,可能很慢。

答案 1 :(得分:0)

如果您定位到iPhone OS 3.0+,则可以使用CAShapeLayer作为路径。您将CGPathRef指定给图层,它将为您处理所有绘图和缩放。您只需设置图层的变换。