实现绘图功能的最佳方式,如Keynote

时间:2010-05-10 07:30:24

标签: iphone optimization uiview drawing calayer

我正在尝试制作一个小工具来绘制简单的几何对象(矩形,圆角矩形,椭圆形,星形......)。 我的目标是制作一些非常接近Keynote(绘图功能)的东西,即让用户添加一个rect(例如),调整它并移动它。我也想要用户可以选择多个对象并将它们一起移动。

我已经考虑过至少3种不同的方法:

  • 为每个对象类型扩展UIView,为Rect类扩展另一个,为Ellipse扩展另一个类,...使用自定义绘图方法。然后将此视图添加为全局视图的子视图。
  • 为每个对象类型扩展CALayer,为Rect类扩展,为Ellipse扩展另一个类,...使用自定义绘图方法。然后将此图层添加为全局视图图层的子图层。
  • 为每个对象类型扩展NSObject,为Rectipse扩展另一个类,为Ellipse扩展另一个类... ...只有一个绘制方法,它将获取CGContext和Rect作为参数并直接绘制其中的表单。这些方法将通过全局视图的绘制方法调用。

我知道前两种方法都带有检测每个物体触摸的功能,可以轻松添加阴影,但是我担心它们有点太重了?这就是为什么我想到了最后一种方式,它似乎是直截了当的。

哪种方式会更有效率???或者也许我没有想到另一种方式?

任何帮助将不胜感激; - )

感谢。

4 个答案:

答案 0 :(得分:1)

我会使用UIKit类来绘制图形,然后从那里分析和优化代码。

Apple / iPad信息:link text

答案 1 :(得分:0)

我的第一感觉是制作第三种方式,但是要确信,就在我发布消息之后,我做了一些只有全局视图和超过200种几何形式(矩形,圆角矩形和椭圆形)的测试它和我只用touchMoved事件移动了一半。我用方式1(Subclassing UIView)和方式3(Subclassing NSObject)进行了这个测试,2对我来说似乎过于严格,并且根本没有帮助我。 重新解决方案是1的方式似乎更有效...当我将60个物体移动到一起时没有延迟!而且使用这种方式可能对我有帮助,因为使用视图会出现一些有趣的函数,比如复杂路径上的触摸检测(参见UIBezierPath),UIView classe处理的对象层次结构......

所以我会用这种方式回到这里分享我的结果; - )

此致

答案 2 :(得分:0)

最好使用CGLayer对象。好处是:

  1. 速度更快,内存效率更高。对于简单对象,添加视图要昂贵得多,并使视图层次结构复杂化。对于复杂的对象,在CGLayers上进行的缓存可以提高性能。

  2. 将对象组合在一起很容易。你把所有东西放在一个新的层中,瞧!几乎没有开销。

  3. 使用CGLayer和其他Quartz对象可以提供更大的灵活性。

  4. 唯一的缺点是您必须直接使用Quartz 2D。这并不困难,但如果您以前没有使用它,需要一些学习。

答案 3 :(得分:0)

CAShapeLayer几乎处理你的选项2.它默认使用rect和圆角rect(参见cornerRadius),或者你可以给它任意形状的路径。对于您的选项1,您可以使用带有UIView的CAShapeLayer而不是实现drawRect,它可能更快。