2009-08-10 17 views

Respuesta

12

OK Estoy respondiendo mi propia pregunta aquí.

Encontré varias referencias a este error a través de Google, pero todos trabajaron en ello jugando con tamaños de fuente. Después de mucha caza encontré this thread que dice que el anti-aliasing se aplica cuando el marco de una vista contiene valores fraccionarios de píxeles, p. si calcula su tamaño como una fracción de la súper vista.

Efectivamente, la conversión de los valores de CGRect a (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 una CGRect a valores integrales.

+7

Te sugiero * no * convertir a int para redondear un valor de coma flotante. Hay una función para eso. Es 'redondo '. Casting to int se volverá a flotar implícitamente cuando 'CGRectMake' toma los parámetros de flotación. Este doble elenco ofusca su intención y posiblemente podría tener un peor rendimiento. Por otra parte, CGRectIntegral es aún mejor. –

+0

también, en lugar de red puede usar cielf o floorf (??) para redondear hacia arriba o hacia abajo al valor integral más cercano, respectivamente. –

26

Utilice CGRectIntegral para asegurarse de que los cuadros de los campos de texto están basados ​​en coordenadas enteras. Obtendrá antialias difuso cuando las cosas se encuentran en coordenadas fraccionarias.

+0

solución más limpia.Para mi propósito, agregué una extensión NSView con '- (void) convertFrameMeasurementsToInteger { \t self.frame = CGRectIntegral (self.frame); } ' .. pero aún mejor sería tener una bandera como' useIntegerBounds' y sobrescribir '-setFrame' – codrut

0

Me encantaría contribuir ya que acabo de descubrir la respuesta por mi cuenta después de un poco de frustración.

El UITextField en InterfaceBuilder tiene una altura de cuadro forzada de 31 píxeles. No se puede hacer clic y arrastrar para cambiar el tamaño ni se puede establecer en las propiedades del marco en IB. Debe ir a viewDidLoad y ajustar la altura del cuadro a 32 píxeles, y esto debería resolver el problema.

Esperemos que las versiones futuras de IB corrijan esto.

1

Además de usar posicionamiento no fraccionado, debe asegurarse de usar una alineación vertical no centrada para el UITextField. Parece que la alineación vertical centrada en combinación con un tamaño de fuente impar también da como resultado un texto borroso.

0

intenté usar CGRectIntegral y esas cosas. En mi caso, cambiando el tamaño mínimo de letra y el tamaño de fuente en IB lo hice.

0

He encontrado este problema antes. La siguiente solución funciona perfectamente para cualquier texto o tamaño de fotograma porque utiliza la función de ronda para eliminar los valores de píxeles fraccionarios. Inserte el siguiente código después de la creación de instancias del 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; 
0

Simplemente ajustar la altura UITextField marco a un valor aún fijado por mí.

+0

Esto en realidad no soluciona el problema, solo funciona alrededor del problema subyacente para que usted consiga un tamaño que no causa el desenfoque. Forzar el marco en valores integrales corrige el problema correctamente. –

+0

Bueno, para mí fue así. Estoy usando systemFontOfSize: 18 – samvermette

Cuestiones relacionadas