2009-09-21 17 views
5

Tengo un UIView personalizado que se dibuja utilizando su método -[drawRect:].Anti-aliasing raro en la vista personalizada

El problema es que el anti-aliasing actúa muy raro ya que las líneas negras, líneas horizontales o verticales, se dibujan muy borrosas.

Si desactivo el anti-aliasing con CGContextSetAllowsAntialiasing, todo se dibuja como se esperaba.

Anti-Aliasing:
alt text http://dustlab.com/stuff/antialias.png

no anti-aliasing (que parece el resultado esperado con AA):
alt text http://dustlab.com/stuff/no_antialias.png

El ancho de línea es exactamente 1, y todas las coordenadas son valores enteros .

Lo mismo ocurre si dibujo un rectángulo usando CGContextStrokeRect, pero no si dibujo exactamente el mismo CGRect con UIRectStroke.

Respuesta

10

Desde un derrame cerebral expande cantidades iguales a ambos lados, una línea de ancho de un píxel no debe colocarse en una coordenada entera, pero con una compensación de 0.5 píxeles.

Calcular las coordenadas correctas para las líneas trazadas como este:

CGPoint pos = CGPointMake(floorf(pos.x) + 0.5f, floorf(pos.y) + 0.5f); 

BTW: No eche sus valores a int y volver a flotar para deshacerse de la parte decimal. Hay una función para esto en C llamada floor.

+2

Además de esto, Apple proporciona algunos consejos útiles y ejemplos de código en la sección "Hacer un dibujo exacto de píxeles" de la Guía de dibujo de cacao: http://developer.apple.com/mac/library/documentation/Cocoa/ Conceptual/CocoaDrawingGuide/Transforms/Transforms.html # // apple_ref/doc/uid/TP40003290-CH204-BCICIJAJ –

+0

aquí es una forma sencilla de evitar sin ningún tipo de código http://www.techpaa.com/2012/06/avoiding -view-edge-antialiasing.html – ShivaPrasad

+0

@jeeva 'UIViewEdgeAntialiasing' es solo para bordes de capas. La pregunta es sobre líneas dibujadas en Quartz. El dibujo de cuarzo no se ve afectado por 'UIViewEdgeAntialiasing'. –

0

En sus marcos de vista, es probable que tenga valores flotantes que no son enteros. Mientras que los marcos son lo suficientemente precisa para hacer fracciones de un píxel (float), se obtiene el efecto borroso a menos que lances a un int

CGRect frame = CGRectMake((int)self.frame.bounds..., (int)...., (int)...., (int)....); 
Cuestiones relacionadas