Línea se borra cuando el dibujo de formas
Pregunta
Estoy tratando de hacer una aplicación para dibujar formas en la pantalla al tocarla.
Puedo dibujar una línea desde un punto a otra- pero borra en cada nuevo sorteo.
Aquí está mi código:
CGPoint location;
CGContextRef context;
CGPoint drawAtPoint;
CGPoint lastPoint;
-(void)awakeFromNib{
//[self addSubview:noteView];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
location = [touch locationInView:touch.view];
[self setNeedsDisplayInRect:CGRectMake(0, 0, 320, 480)];
}
- (void)drawRect:(CGRect)rect {
context = UIGraphicsGetCurrentContext();
[[UIColor blueColor] set];
CGContextSetLineWidth(context,10);
drawAtPoint.x =location.x;
drawAtPoint.y =location.y;
CGContextAddEllipseInRect(context,CGRectMake(drawAtPoint.x, drawAtPoint.y, 2, 2));
CGContextAddLineToPoint(context,lastPoint.x, lastPoint.y);
CGContextStrokePath(context);
lastPoint.x =location.x;
lastPoint.y =location.y;
}
Agradecemos su ayuda -
Nir.
Solución
A medida que han descubierto, -drawRect es donde se muestra el contenido de una vista. Usted sólo 'ver' en la pantalla lo que se dibuja aquí.
Esto es mucho más bajo que el nivel de algo como Flash en la que podría añadir un clip de película que contiene una línea para el escenario y un tiempo después agregar otro clip de película que contiene una línea para la etapa y ahora se ve - dos líneas!
Usted tendrá que hacer algún trabajo y prdobably configurar algo así ..
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
location = [touch locationInView:touch.view];
[self addNewLineFrom:lastPoint to:location];
lastPoint = location;
[self setNeedsDisplayInRect:CGRectMake(0, 0, 320, 480)];
}
- (void)drawRect:(CGRect)rect {
context = UIGraphicsGetCurrentContext();
for( Line *eachLine in lineArray )
[eachLine drawInContext:context];
}
Creo que se puede ver la forma de carne por esto a lo que necesita.
Otra manera de abordar esto es utilizar CALayers. Usando este método usted no dibujar dentro de - - drawRect (void) a todos - que agregar y quitar capas, dibuja lo que te gusta dentro de ellos, y la vista se encargará de componer juntos y dibujar en la pantalla, según sea necesario. Probablemente más de lo que busca.
Otros consejos
Cada vez que se llama drawRect
, se empieza con una pizarra en blanco. Si no seguimiento de todo lo que ha dibujado antes con el fin de dibujar de nuevo, entonces termina único dibujo el último golpe de su dedo, y no cualquiera de los anteriores. Usted tendrá que mantener un registro de todos sus golpes de los dedos con el fin de que vuelvan a dibujar cada vez que se llama drawRect
.
En lugar de volver a dibujar cada línea, se puede dibujar en una imagen y luego simplemente mostrar la imagen en su método de drawRect:
. La imagen se acumulará las líneas para usted. Por supuesto, este método hace que deshacer más difícil de implementar.
En la Guía de programación de aplicaciones iPhone :
Utilice la UIGraphicsBeginImageContext función para crear una nueva imagen basada contexto gráfico. Después de la creación de este contexto, se puede dibujar su imagen contenidos en ella y luego usar el UIGraphicsGetImageFromCurrentImageContext la función de generar una imagen basada en lo que dibujó. (Si lo desea, puede incluso seguir dibujando y generar imágenes adicionales.) Cuando haya terminado la creación de imágenes, utilice el UIGraphicsEndImageContext función de cerrar el contexto gráfico. Si tu preferir el uso de núcleo de gráficos, se puede utilizar la función CGBitmapContextCreate para crear un contexto gráfico de mapa de bits y extraer el contenido de su imagen en ella. Cuando termine de dibujar, utilizar el CGBitmapContextCreateImage función de crear un mapa de bits de la CGImageRef contexto. Puede dibujar el Núcleo imagen de gráficos directamente o utilizar esto para inicializar un objeto UIImage.