Pregunta

Estoy teniendo un problema con el texto de un UITextField siendo borrosa / anti-alias incluso con un tamaño de letra estándar. El texto aparecerá nítido cuando el control es el primero en responder, pero borrosa de nuevo cuando se pierde el foco:

alt text
(fuente: mikeweller.com )

¿Alguien sabe cómo solucionar este problema?

¿Fue útil?

Solución 2

Aceptar que estoy respondiendo a mi propia pregunta aquí.

He encontrado una serie de referencias a este error a través de Google, pero todo el mundo trabajaba alrededor de él jugando con tamaños de fuente. Después de mucha caza encontré este hilo que dice se aplica anti-aliasing cuando marco de una vista contiene valores de píxeles fraccionarios, por ejemplo, si se calcula su tamaño como una fracción de la super vista.

Efectivamente, echando a los valores CGRect (int) para el marco de la vista funcionó a la perfección. Así como un ejemplo, si usted quiere que su campo de texto para estar centrada verticalmente en la supervista, usted debe utilizar un (int) Reparto de la siguiente manera:

textFieldWidth = 300;
textFieldHeight = 31;
offsetX = 0;
offsetY = (superview.bounds.size.height - textFieldHeight) / 2;

textField.frame = CGRectMake((int) offsetX,
                             (int) offsetY,
                             (int) textFieldWidth,
                             (int) textFieldHeight);

También existe la función CGRectIntegral que se puede utilizar para convertir un CGRect a valores enteros.

Otros consejos

Con CGRectIntegral para asegurarse de que los marcos de los campos de texto se basan en coordenadas enteras. Usted obtendrá antialiasing borrosa cuando las cosas se encuentran en las coordenadas fraccionarias.

Además de utilizar posicionamiento no fraccionada uno debe asegurarse de utilizar una alineación no-centrado vertical para la UITextField. Parece que la alineación vertical centrada en combinación con un impares resultados tamaño de fuente en texto borrosa, también.

Me encantaría contribuir lo acabo de descubrir la respuesta en mi propia después de un poco de frustración.

El UITextField en InterfaceBuilder tiene una altura de bastidor forzada de 31 píxeles. Esto no puede ser arrastrado haga clic-para cambiar el tamaño ni se puede configurar en las propiedades del marco de IB. Tienes que ir a viewDidLoad y ajustar la altura del marco a 32 píxeles, y esto debería resolver el problema.

Con suerte versiones futuras de IB corregirá esto.

He intentado utilizar CGRectIntegral y esas cosas. En mi caso, el cambio de tamaño de la fuente min y tamaño de fuente en IB lo hizo.

Me encontré con este problema antes. La solución a continuación funciona perfectamente para cualquier tamaño de texto o el marco, ya que utiliza la función de redondeo para deshacerse de los valores de los píxeles fraccionarios. Inserte el siguiente código después de la creación de instancias de la UITextField en cuestión.

CGRect temp = textField.frame;
temp.origin.x = round(temp.origin.x);
temp.origin.y = round(temp.origin.y);
textField.frame = temp;

Simplemente ajuste de la altura del marco UITextField a un valor aún fijado por mí.

este sitio explica que que puede estar relacionado con el cambio de tamaño y el iOS no hacerse cargo de este error para las capas, sólo los distintos puntos de vista. He actualizado a Swift 4:

view.contentScaleFactor = UIScreen.main.scale
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top