UIScrollView捏缩放到CGContextStrokePath而不改变线宽

时间:2012-06-20 09:34:23

标签: iphone ios uiscrollview quartz-graphics quartz-2d

我有一个包含自定义UIView的UIScrollView。在我的UIView中,我重写了drawRect以使用CGContextStrokePath绘制路径。我想略微改变缩放的工作方式。缩小缩小将显示屏幕上的更多路径。这就是我想要的,但我希望线宽保持不变而不缩小,因为它们对用户来说仍然是清晰的。

我以为我会这样做(myUIView缩放目标称为_lineView)

-(void)scrollViewDidZoom:(UIScrollView *)pScrollView
    {
      _lineView.zoomScale = _scrollView.zoomScale;
      [_lineView setNeedsDisplay];
    }

然后在我的_lineView drawRect方法中计算一个合适的线条笔划大小,以便在缩小时提供恒定线宽的效果。

这真的很慢,而且我已经读到这是预期的,因为drawrect并未优化为每秒多次调用。

然后我开始考虑使用GLKView而只是直接在opengl中渲染整个东西。这个问题是我必须自己实现所有的缩放和平移(在UiScrollView中你可以免费获得所有可爱的变焦和平移反弹效果)。我还必须实现我想在opengl,按钮等中使用的所有控件。

有没有办法在使用Quartz2d的同时做到这一点?我觉得opengl会给我很大的力量,但是如果我沿着这条路走下去,我需要花更长的时间来完成其余的应用程序。

2 个答案:

答案 0 :(得分:3)

我想出来了。我发现了一种简单的方法,可以完全放慢缩放/弹跳动画的速度并且非常快速且流畅。

Quartz有一个名为CAShapeLayer的类,可以让你做一些很酷的东西。其中包括能够设置CGPath属性并指定线宽。更改将反映在视图中。

所以我基本上从我的scrollViewDidZoom方法调用shapeLayer.lineWidth,它完全符合我的需要。

答案 1 :(得分:1)

如果我是你,我会做的是在缩放时使用默认的缩放行为(不会重绘,而只是将变换应用于缩放视图,这可以由GPU非常快速地完成,但是你注意到会导致质量低劣。)

然后,当用户完成缩放时,像现在一样重绘整个视图。适当的委托方法是scrollViewDidEndZooming:withView:atScale:

这样,在缩放完成后,您可以快速(但稍微丑陋)进行缩放,并且显示效果很好(但略微可能不显眼,速度较慢)。