iphone ios uiview uiimage quartz-graphics

iphone - set image imageview swift



Uiimage de UIView: ¿más alta que la resolución en pantalla? (3)

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

Tengo un UIView que estoy representando a un UIImage a través del típico método UIGraphicsBeginImageContextWithOptions, utilizando una escala de 2.0, por lo que la salida de la imagen siempre será la versión "pantalla retina" de lo que se mostrará en pantalla, independientemente de la imagen real resolución de la pantalla.

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

¿Hay algo que estoy haciendo mal o hay alguna manera de hacer que el texto se vea nítido y nítido en el nivel de escala más alto? ¿O hay otra forma de hacer esto que no sea usar el parámetro de escalado de UIGraphicsBeginImageContextWithOptions que tendría mejores resultados? ¡Gracias!


Intente renderizar a una imagen con tamaño doble y luego cree la imagen escalada:

UIGraphicsBeginImageContextWithOptions(size, NO, 1.0); // Do stuff UImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); newImage=[UIImage imageWithCGImage:[newImage CGImage] scale:2.0 orientation:UIImageOrientationUp];

Donde: tamaño = escala de tamaño real *;


La solución es cambiar el contenido de las etiquetas en Escala a 2 antes de dibujarlo, luego restablecerlo inmediatamente después. Acabo de codificar un proyecto para verificarlo, y está funcionando bien haciendo una imagen 2x en un teléfono de retina normal (simulador). [Si tienes un lugar público puedo ponerlo, házmelo saber.]

EDITAR: el código extendido recorre las subvistas y cualquier contenedor UIViews para configurar / 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]; } } ]; }