2011-08-27 16 views
5

Soy nuevo en Cocoa y estoy buscando un pequeño consejo para una aplicación de experimentados Cocoa-ers.Consejos para una aplicación de dibujo de cacao

Estoy construyendo una aplicación básica de estilo OmniGraffle donde los objetos se dibujan/arrastran sobre un lienzo. Una vez que los objetos están en el lienzo, pueden seleccionarse para modificar sus propiedades (color de relleno, color/ancho de trazo, etc.), cambiar su tamaño, moverse a una nueva posición, etc.

Para calentarse, He escrito una aplicación de dibujo básico que crea objetos (círculos, rectángulos, etc.) dibujados con el mouse en un NSView personalizado, agrega los objetos a una colección NSArray y muestra el contenido de la colección en la vista. Podría continuar en este sentido, pero voy a tener que agregar soporte para detectar la selección de objetos, resolver z-indexing, focus highlighting, arrastrar manejadores, etc. con todo el renderizado asociado. Además, renderizar cada objeto en cada ciclo parece terriblemente dispendioso.

Parece que un mejor enfoque sería colocar objetos de vista livianos en un lienzo que pudieran detectar los eventos del mouse sobre ellos mismos, dibujar ellos mismos y sus anillos de enfoque, y así sucesivamente. Sin embargo, aunque NSView parece un objeto con estas propiedades, veo mucha charla en la web sobre que es un componente pesado con mucho equipaje. He tropezado con NSCell y he leído sobre ellos, pero no estoy seguro de si son la alternativa correcta.

¿Alguna sugerencia? Si puedes empujarme en la dirección correcta, lo agradecería muchísimo.

+0

Definitivamente desaconsejaría usar 'NSCell'. Incluso 'NSTableView' se ha alejado de él en su última iteración. 'NSCell' no es divertido para trabajar. –

+1

También le recomiendo encarecidamente que mire el ejemplo de Sketch (creo que el actual se llama "Sketch + Accesibilidad" si busca en los documentos) si aún no lo ha hecho. Hay muchas buenas ideas ahí. –

Respuesta

3

Primera regla de optimización: No lo hagas primero.

Una NSView personalizada por forma suena bien para mí. Si lo desea, diferentes subclases para diferentes formas dependerán de usted; Comenzaría con una única clase de vista de forma genérica y formas capaces de describirse a sí mismas como rutas de Bézier, pero no sean demasiado estrictas para aferrarse a eso; cámbielo si eso lo hiciera más fácil. Simplemente impleméntalo sin embargo tiene sentido para ti.

Luego, una vez que lo tenga funcionando, píntelo. Haz tantas formas como puedas. Entonces haz más. Formas de alto contenido de polietileno Intersecciones Rellenos, trazos, sombras y degradados. Probablemente deberías crear un documento separado para cada factor estresante. Observe solo a nivel de usuario qué es lento. Luego, ejecute su aplicación en Instrumentos y observe por qué es lenta.

Quizás las vistas resulten ser la solución incorrecta. No te olvides de mirar CALayers. Pero no descartes nada como lento hasta que lo hayas probado y medido.

+0

Bueno, todo depende del caso de uso típico: si se espera que la aplicación generalmente maneje miles de objetos, preferiría evitar usar miles de instancias de NSView y elegir un diseño diferente por adelantado. – Jay

Cuestiones relacionadas