2011-03-24 17 views
17

Tengo un UIView que estoy renderizando en un UIImage mediante el método UIGraphicsBeginImageContextWithOptions típico, usando una escala de 2.0, por lo que la salida de la imagen siempre será la versión "retina display" de lo que aparecería en pantalla, independientemente de la la resolución de pantalla real del usuario.Uiimage de UIView: ¿superior a la resolución en pantalla?

El UIView I'm rendering contiene imágenes y texto (UIImages y UILabels). La imagen está apareciendo en el UIImage renderizado a su resolución completa, y se ve muy bien. Pero los UILabels parecen haber sido rasterizados en una escala de 1.0 y luego aumentado a 2.0, lo que resulta en texto borroso.

¿Hay algo que estoy haciendo mal, o hay alguna manera de hacer que el texto se vea nítido a mayor escala? ¿O hay alguna forma de hacer esto que no sea usar el parámetro de escala de UIGraphicsBeginImageContextWithOptions que tendría mejores resultados? ¡Gracias!

Respuesta

9

La solución es cambiar el contenido de las etiquetas Escala a 2 antes de dibujarlo, y luego volver a establecerlo inmediatamente después. Acabo de codificar un proyecto para verificarlo, y está funcionando bien haciendo una imagen de 2x en un teléfono retina normal (simulador). [Si usted tiene un lugar público puedo poner Avísame.]

EDIT: el código extendido camina por las subvistas y cualquier UIViews contenedores para armar/desarmar la escala

- (IBAction)snapShot:(id)sender 
{ 
    [self changeScaleforView:snapView scale:2]; 

    UIGraphicsBeginImageContextWithOptions(snapView.bounds.size, snapView.opaque, 2); 
    [snapView.layer renderInContext:UIGraphicsGetCurrentContext()]; 

    UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    imageDisplay.image = img; // contentsScale 
    imageDisplay.contentMode = UIViewContentModeScaleAspectFit; 

    [self changeScaleforView:snapView scale:1]; 
} 

- (void)changeScaleforView:(UIView *)aView scale:(CGFloat)scale 
{ 
    [aView.subviews enumerateObjectsUsingBlock:^void(UIView *v, NSUInteger idx, BOOL *stop) 
     { 
      if([v isKindOfClass:[UILabel class]]) { 
       v.layer.contentsScale = scale; 
      } else 
      if([v isKindOfClass:[UIImageView class]]) { 
       // labels and images 
       // v.layer.contentsScale = scale; won't work 

       // if the image is not "@2x", you could subclass UIImageView and set the name of the @2x 
       // on it as a property, then here you would set this imageNamed as the image, then undo it later 
      } else 
      if([v isMemberOfClass:[UIView class]]) { 
       // container view 
       [self changeScaleforView:v scale:scale]; 
      }  
     } ]; 
} 
+0

Esto funciona, pero si intenta capturar una UITableView, es complicado cambiar cada capa individualmente. ¿No hay una forma de cambiarlo para todas las subvistas recursivamente? – charliehorse55

+1

Bueno, no hay ningún comando que yo sepa, pero tenga en cuenta que el código expandido se repetirá y hará la mayor parte del trabajo. Tendrás que hacer algo especial si no configuras un imageViews en una imagen 2x (que funciona bien para pantallas que no son retina, simplemente hace un poco más de trabajo para el sistema cuando se renderiza). –

2

Try prestación a una imagen con tamaño doble, y luego crear la imagen escalada:

UIGraphicsBeginImageContextWithOptions(size, NO, 1.0); 
// Do stuff 
UImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

newImage=[UIImage imageWithCGImage:[newImage CGImage] scale:2.0 orientation:UIImageOrientationUp]; 

Dónde: size = realSize * escala;

+0

No estoy seguro de entender lo que está diciendo. No tengo un CGImage con el que estoy trabajando, tengo un UIView, que luego estoy renderizando en un UIImage ... – DanM

+0

Editado. Debería hacer lo que quieras. – ssteinberg

+1

¿no es solo ir a escala * todo *? ¿Entonces ahora tanto el texto * como la imagen estarán borrosos? – DanM

0

He estado luchando con las mismas rarezas en el contexto de la visualización de texto a la representación de PDF. Descubrí que hay algunas propiedades documentadas en los objetos CALayer que componen la vista. Tal vez sea útil establecer la escala de rasterización de la (s) capa (s) secundaria (s) relevante (s).

Cuestiones relacionadas