views:

206

answers:

4

Hi all,

I'm trying to make a little iPad tool's for drawing simple geometrical objects (rect, rounded rect, ellipse, star, ...). My goal is to make something very close to Keynote (drawing feature), i.e. let the user add a rect (for instance), resizing it and moving it. I want too the user can select many objects and move them together.

I've thought about at least 3 differents ways to do that :

  • Extends UIView for each object type, a class for Rect, another for Ellipse, ... With custom drawing method. Then add this view as subview of the global view.
  • Extends CALayer for each object type, a class for Rect, another for Ellipse, ... With custom drawing method. Then add this layer as sublayer of the global view layer's.
  • Extends NSObject for each object type, a class for Rect, another for Ellipse, ... With just a drawing method which will get as argument a CGContext and a Rect and draw directly the form in it. Those methods will be called by the drawing method of the global view.

I'm aware that the two first ways come with functions to detect touch on each object, to add easily shadows,... but I'm afraid that they are a little too heavy ? That's why I thought about the last way, which it seems to be straight forward.

Which way will be the more efficient ??? Or maybe I didn't thought another way ?

Any help will be appreciated ;-)

Thanks.

+1  A: 

I'd use the UIKit classes to do your drawing, then profile and optimise your code from there.

Apple/iPad info: link text

petert
A: 

Hi

My first feeling was to make the 3rd way, but to be convinced, just after I've posted my message, I did some tests with just a global view and over 200 geometrical forms (Rect, Rounded Rect and Ellipse) on it and I move only a half with touchMoved event. I did this test with the way 1 (Subclassing UIView) and the way 3 (Subclassing NSObject), the way 2 seems to me too restrictive and not help me at all. The resuslt is that the way 1 seems to be more efficient... There is no lag when I move 60 objects together ! Moreover using this way would probably help me because using view comes which some interesting functions like touch detection on complex path (see UIBezierPath), object hierarchy handled by the UIView classe...

So I will use that way and come back here to share my results ;-)

Regards

Shamseddine
A: 

It's better to use CGLayer objects. The benefits are:

  1. It's much faster and more memory efficient. For simple objects, adding a view is much more expensive and complicates the view hierarchy. For complicated objects, the caching done on CGLayers can boost performance.

  2. It's easy to group objects together. you just put everything in a new layer, and voila! There's almost no overhead.

  3. Using CGLayer and other Quartz objects gives you a lot more flexibility.

The only drawback is that you have to directly use Quartz 2D. It's not really difficult, but needs some learning if you haven't used it before.

Mo
A: 

CAShapeLayer pretty much handles your option 2. It does rect and rounded rect (see cornerRadius) by default, or you can give it a path for any arbitrary shape. For your option 1, you can use a CAShapeLayer with a UIView instead of implementing drawRect and it may be faster.

drawnonward