programas programa para gratis dibujar anime iphone uiview drawing cgbitmapcontextcreate off-screen

iphone - gratis - programa para dibujar



UIView: ¿cómo hacer un dibujo no destructivo? (4)

Es bastante común dibujar todo en una imagen fuera de la pantalla, y simplemente mostrar esta imagen al dibujar la pantalla. Puedes leer: Creando un contexto de gráficos de mapa de bits .

Mi pregunta original:

Estoy creando una aplicación de dibujo simple y necesito poder dibujar sobre el contenido existente, previamente dibujado en mi drawRect . ¿Cuál es la forma correcta de dibujar sobre el contenido existente sin reemplazarlo por completo?

Basado en las respuestas recibidas aquí y en otros lugares, aquí está el trato.

  1. Debería estar preparado para volver a dibujar todo el rectángulo cada vez drawRect se llame a drawRect .

  2. No puede evitar que los contenidos se borren haciendo lo siguiente:

    [self setClearsContextBeforeDrawing: NO];

    Esto no es más que una sugerencia para el motor de gráficos de que no tiene sentido que haga que la vista se realice previamente, ya que es probable que tenga que volver a dibujar toda el área de todos modos. Puede evitar que su vista se borre automáticamente, pero no puede depender de ella .

  3. Para dibujar en la parte superior de su vista sin borrar, haga su dibujo en un contexto de mapa de bits fuera de pantalla (que el sistema nunca borra). Luego, en su drawRect , copie desde este búfer fuera de pantalla a la vista.

Ejemplo:

- (id) initWithCoder: (NSCoder*) coder { if (self = [super initWithCoder: coder]) { self.backgroundColor = [UIColor clearColor]; CGSize size = self.frame.size; drawingContext = [self createDrawingBufferContext: size]; } return self; } - (CGContextRef) createOffscreenContext: (CGSize) size { CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height, 8, size.width*4, colorSpace, kCGImageAlphaPremultipliedLast); CGColorSpaceRelease(colorSpace); CGContextTranslateCTM(context, 0, size.height); CGContextScaleCTM(context, 1.0, -1.0); return context; } - (void)drawRect:(CGRect) rect { UIGraphicsPushContext(drawingContext); CGImageRef cgImage = CGBitmapContextCreateImage(drawingContext); UIImage *uiImage = [[UIImage alloc] initWithCGImage:cgImage]; UIGraphicsPopContext(); CGImageRelease(cgImage); [uiImage drawInRect: rect]; [uiImage release]; }

TODO : ¿alguien puede optimizar el drawRect para que solo se use la región del rectángulo modificada (generalmente pequeña) para la copia?


Este parece ser un método mejor que el que he estado usando. Es decir, en un evento de toques hago una copia de la vista que se va a actualizar. Luego, en drawRect, tomo esa imagen y la dibujo a la vista y hago que la otra vista cambie al mismo tiempo.

Pero esto parece ineficiente, pero la única forma en que me di cuenta de cómo hacerlo.


Esto evita que su vista se borre antes de que se realice drawRect:

[self.layer setNeedsDisplay];

Además, creo que es mejor hacer todo el dibujo en el método drawRect (a menos que tenga una buena razón para no hacerlo). Dibujar fuera de la pantalla y transferir lleva más tiempo y agrega más complejidad que simplemente dibujar todo una vez.


En la optimización de drawRect

Prueba esto:

- (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGImageRef cgImage = CGBitmapContextCreateImage(drawingContext); CGContextClipToRect(context, rect); CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), cgImage); CGImageRelease(cgImage); }

Después de eso, también debes comentar estas líneas en tu código:

//CGContextTranslateCTM(context, 0, size.height); //CGContextScaleCTM(context, 1.0, -1.0);

También creó una pregunta separada para asegurarse de que es la forma óptima.