¿Por qué las líneas menores a 1.0pts no se reproducen correctamente en pantallas sin retina?

self.layer.borderWidth = 0.5; 

en un UIButton o UITextField renderizar bien en una pantalla de retina, pero en una pantalla sin retina solo los bordes superior e izquierdo aparecen mientras que los bordes derecho e inferior no se representan.

Supongo que tiene algo que ver con el dpi de la pantalla y cómo se dibujan las líneas de subpunto, pero es posible que haya una mejor explicación.

Pregunta: Me gustaría saber si es posible tener todos los lados de un UIView de UIView como se esperaba en las pantallas de retina y no retina con borderWidth configurado a 0.5 .

Si desea una línea de un solo píxel (no de punto), deberá usar un ancho de borde diferente según la escala de la pantalla.

P.ej:

 CGFloat scale = [[UIScreen mainScreen] scale]; if (scale == 2.0) { // retina screen; self.layer.borderWidth = 0.5; } else { // non-retina screen self.layer.borderWidth = 1.0; } 

Ahora que se admiten múltiples escalas (@ 3x), probablemente sea mejor escribir la respuesta de Matt como sigue:

 CGFloat scale = [[UIScreen mainScreen] scale]; CGFloat width = scale > 0.0 ? 1.0 / scale : 1.0; [self.layer setBorderWidth:width];