2010-05-10 14 views
6

Estoy tratando de hacer una pequeña herramienta de iPad para dibujar objetos geométricos simples (rect, redondos rect, elipse, estrella, ...). Mi objetivo es hacer algo muy parecido a Keynote (función de dibujo), es decir, dejar que el usuario agregue un rect (por ejemplo), cambiarle el tamaño y moverlo. Yo también quiero que el usuario pueda seleccionar muchos objetos y moverlos juntos.La mejor manera de implementar funciones de dibujo como Keynote

He pensado en por lo menos 3 diferentes maneras de hacerlo:

  • extiende UIView para cada tipo de objeto, una clase para Rect, otra para la elipse, ... Con método de dibujo personalizado. A continuación, agregue esta vista como subvista de la vista global.
  • Extiende CALayer para cada tipo de objeto, una clase para Rect, otra para Ellipse, ... Con método de dibujo personalizado. A continuación, agregue esta capa como subcapa de la capa de vista global.
  • Extiende NSObject para cada tipo de objeto, una clase para Rect, otra para Ellipse, ... Con solo un método de dibujo que obtendrá como argumento un CGContext y un Rect y dibujará directamente el formulario en él. Esos métodos serán llamados por el método de dibujo de la vista global.

Soy consciente de que las dos primeras formas vienen con funciones para detectar el tacto en cada objeto, para agregar sombras fácilmente ... ¿pero me temo que son un poco demasiado pesadas? Es por eso que pensé en la última manera, que parece ser directa.

¿Cuál será la forma más eficiente? ¿O tal vez no pensé de otra manera?

Cualquier ayuda será apreciada ;-)

Gracias.

Respuesta

1

Usaría las clases de UIKit para hacer tu dibujo, luego perfilaría y optimizaría tu código desde allí.

información

de Apple/IPAD: link text

0

Mi primera sensación fue a hacer la tercera manera, pero para ser convencido, justo después de que he publicado mi mensaje, me hizo algunas pruebas con sólo una visión global y más de 200 formas geométricas (Rect, Rectángulo redondeado y Elipse) en él y muevo solo la mitad con el evento TouchMoved. Hice esta prueba con la forma 1 (Subclasificación de UIView) y la forma 3 (Subclasificación de NSObject), de la forma en que 2 me parece demasiado restrictiva y no me ayuda en absoluto. El resuslt es que la forma en que 1 parece ser más eficiente ... ¡No hay retraso cuando muevo 60 objetos juntos! Además, usar esta forma probablemente me ayude porque el uso de view viene con algunas funciones interesantes como touch detection en ruta compleja (ver UIBezierPath), jerarquía de objetos manejada por UIView classe ...

Así que usaré esa forma y volveré aquí para compartir mis resultados ;-)

Saludos

0

es mejor utilizar objetos CGLayer. Los beneficios son:

  1. Es mucho más rápido y más eficiente en la memoria. Para objetos simples, agregar una vista es mucho más costoso y complica la jerarquía de la vista. Para objetos complicados, el almacenamiento en caché hecho en CGLayers puede aumentar el rendimiento.

  2. Es fácil agrupar objetos juntos. simplemente pones todo en una nueva capa, y ¡voilá! Casi no hay gastos generales.

  3. El uso de CGLayer y otros objetos de cuarzo le da mucha más flexibilidad.

El único inconveniente es que tiene que usar directamente Quartz 2D. No es realmente difícil, pero necesita algo de aprendizaje si no lo has usado antes.

0

CAShapeLayer maneja prácticamente su opción 2. Realiza rect y redondos rect (ver cornerRadius) por defecto, o puede darle una ruta para cualquier forma arbitraria. Para su opción 1, puede usar un CAShapeLayer con un UIView en lugar de implementar drawRect y puede ser más rápido.

Cuestiones relacionadas