2010-11-19 11 views
8

Tengo un UIView y dentro de él dibujé una línea usando Core Graphics anulando drawRect. Esta vista también contiene una subvista que también dibuja una línea. Sin embargo, mientras que los dos puntos de vista están utilizando más o menos el mismo código (para propósitos de prueba por lo menos), las líneas dibujadas en ellos no aparecen los mismos:iPhone Core Graphics línea discontinua más gruesa para la subvista

Image problem

Como se puede ver - la línea discontinua en la La parte superior es notablemente más gruesa que la inferior y no tengo idea de por qué. A continuación se muestra el código utilizado por los dos UIViews en sus métodos drawRect. Si tienes alguna idea de por qué sucede esto, te agradecería tu ayuda y consejo.

Primera Vista:

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextSetStrokeColorWithColor(context, [[UIColor whiteColor] CGColor]); 

CGFloat dashes[] = {1,1}; 

CGContextSetLineDash(context, 0.0, dashes, 2); 
CGContextSetLineWidth(context, 0.6); 

CGContextMoveToPoint(context, CGRectGetMinX(rect), CGRectGetMaxY(rect)); 
CGContextAddLineToPoint(context, CGRectGetMaxX(rect), CGRectGetMaxY(rect)); 

CGContextStrokePath(context); 

SubUIView *view = [[SubUIView alloc] initWithFrame:rect]; 
[self addSubview:view]; 
[view release]; 

La vista única duda se está elaborando una vez. Agradezco drawRect puede no ser el mejor lugar para agregar una subvista, pero el problema se mantiene incluso cuando se agrega en el método principal initWithFrame.

Segunda Vista:

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextSetStrokeColorWithColor(context, [[UIColor whiteColor] CGColor]); 

CGFloat dashes[] = {1,1}; 

CGContextSetLineDash(context, 0.0, dashes, 2); 
CGContextSetLineWidth(context, 0.6); 

CGContextMoveToPoint(context, CGRectGetMinX(rect), CGRectGetMidY(rect)); 
CGContextAddLineToPoint(context, CGRectGetMaxX(rect), CGRectGetMidY(rect)); 

CGContextStrokePath(context); 
+1

¿Por qué está agregando una subvista en la primera vista 'drawRect:'? – jer

+0

@jer: ¿Importa necesariamente? Puedo agregar la subvista desde otro método como 'initWithFrame', pero aún hay una diferencia en el grosor de la línea. A menos que no tenga la intención de agregar subvistas a una vista que 'dibuja' sobre sí misma y, por lo tanto, el problema (?), Pero no he leído esto en ningún lugar ... todavía. – JoeR

+1

@JoeR, sí, puede tener importancia: agrega subvistas cada vez que su vista se dibuja para que pueda terminar con varias subvistas idénticas colocadas una sobre otra, y eso puede causar que las líneas de la subvista aparezcan más gruesas ya que se dibujaron varias veces – Vladimir

Respuesta

6

Podría ser el resultado de suavizado si su rect no cae en números enteros. Puede desactivar el anti-aliasing con CGContextSetShouldAntialias(context, NO). Creo que también hay una función para hacer una integral integral, pero no recuerdo qué es.

+0

¡Gracias! ¡Esto lo solucionó! Supongo que el hecho de que ninguna de las líneas era blanca como se especifica al llamar a 'CGContextSetStrokeColorWithColor' debería haber sido una pista de que estaba ocurriendo un anti-aliasing. Me pregunto * por qué * esto sucedió en la subvista y no en la vista principal, pero por ahora solo agradeceré que esté funcionando. – JoeR

+3

Es CGRectIntegral() – nielsbot

-2

Primero, debe solucionar el problema de que el código de dibujo sea WET *. Usted dice que está haciendo esto "con fines de prueba", pero esto en realidad dificulta las pruebas, ya que tiene que cambiar ambas partes del código y/o mantener en línea la versión en la que está trabajando. El peor caso es cuando cambias ambas piezas de código de diferentes maneras y tienes que fusionarlas a mano.

Yo diría mover el código de línea punteada a la subvista, agregar propiedades para todo lo que los dos códigos necesitan hacer de manera diferente, y crear dos subvistas (y no en drawRect: -en serio).

En cuanto al problema real: Bueno, no veo una imagen grande, veo una imagen pequeña, y solo puedo adivinar que la mayor audacia de la línea superior que la de la línea inferior significa que la parte superior la línea es más gruesa Por favor, el rect no es necesariamente el límite de su imagen. Nunca supongas que lo es, o obtendrás un dibujo original cuando no lo es. Supongamos que es una parte de los límites, posiblemente, pero posiblemente no, todo. Cuando te refieres a [self bounds], di [self bounds].

El problema es probablemente la diferencia entre CGRectGetMidY([self bounds]) y CGRectGetMaxY([self bounds]). Uno incluye una fracción que divide un píxel, mientras que el otro es un múltiplo de un píxel o cerca de él. (No necesariamente un múltiplo de 1, en una pantalla Retina, 1 pt = 2 píxeles, por lo que 1 píxel = 0.5 pt). Intenta pavimentar los dos números y, opcionalmente, agregar 0.5, y ver de qué manera te gusta más.

No hay forma de que funcione a la perfección con un ancho de línea de 0,6 ptos. Simplemente no hay un número entero de píxeles que funcione. Todo lo que puedes hacer es resolver lo que se ve mejor y hacer eso.

* Escrito en otros lugares Demasiado, lo opuesto a DRY.

+0

Gracias por su contribución. Cambié la imagen grande cuando escribí la pregunta ya que el pequeño parecía hacer el trabajo. http://i.imgur.com/KalTm.png - si eso ayuda. De todos modos, entiendo el problema con el tamaño del punto que estoy usando, lo he elevado a 1.0, pero incluso en este caso ocurre el mismo problema. Desactivar anti aliasing hace el truco, aunque según la respuesta aceptada. – JoeR

Cuestiones relacionadas