¿Cuál es el secreto detrás de "contentScaleFactor" de UIView cuando se usa con CATiledLayer?
ios4 uiscrollview (2)
Saludos,
Estoy trabajando en una aplicación inspirada en el ejemplo "ZoomingPDFViewer" que viene con el SDK de iOS. En algún momento encontré el siguiente bit de código:
// to handle the interaction between CATiledLayer and high resolution
// screens, we need to manually set the tiling view''s
// contentScaleFactor to 1.0. (If we omitted this, it would be 2.0
// on high resolution screens, which would cause the CATiledLayer
// to ask us for tiles of the wrong scales.)
pageContentView.contentScaleFactor = 1.0;
Intenté aprender más sobre contentScaleFactor
y lo que hace. Después de leer toda la documentación de Apple que lo mencionó, busqué en Google y nunca encontré una respuesta definitiva a lo que realmente hace.
Aquí hay algunas cosas que tengo curiosidad sobre:
Parece que
contentScaleFactor
tiene algún tipo de efecto en el contexto de los gráficos cuando se dibujan los contenidos de un UIView / CALayer. Esto parece ser relevante para pantallas de alta resolución (como la pantalla Retina). ¿Qué tipo de efecto tienecontentScaleFactor
y en qué?Al usar un
UIScrollView
y configurarlo para hacer zoom, digamos, mi contentView ; todas las subvistas de contentView también están siendo escaladas. ¿Como funciona esto? ¿Qué propiedades modificaUIScrollView
para que incluso los reproductores de video se vuelvan borrosos y se amplíen?
TL; DR: ¿Cómo funciona la función de zoom de UIScrollView "debajo del capó"? Quiero entender cómo funciona para poder escribir el código correcto.
Cualquier sugerencia y explicación es muy apreciada! :)
Apple tiene una sección sobre esto en su página "Pantallas de alta resolución de apoyo" en la documentación de desarrollo de iOS.
La página dice:
Actualización de su código de dibujo personalizado
Cuando realice un dibujo personalizado en su aplicación, la mayoría de las veces no debería preocuparse por la resolución de la pantalla subyacente. Las tecnologías de dibujo nativas aseguran automáticamente que las coordenadas que especifique en el mapa de espacio de coordenadas lógicas correctamente a píxeles en la pantalla subyacente. A veces, sin embargo, es posible que necesite saber cuál es el factor de escala actual para representar correctamente su contenido. Para esas situaciones, UIKit, Core Animation y otros marcos del sistema le brindan la ayuda que necesita para hacer su dibujo correctamente.
Creación de imágenes de mapa de bits de alta resolución mediante programación Si actualmente utiliza la función UIGraphicsBeginImageContext para crear mapas de bits, es posible que desee ajustar su código para tener en cuenta los factores de escala. La función UIGraphicsBeginImageContext siempre crea imágenes con un factor de escala de 1.0. Si el dispositivo subyacente tiene una pantalla de alta resolución, es posible que una imagen creada con esta función no aparezca tan fluida cuando se renderiza. Para crear una imagen con un factor de escala distinto de 1.0, use en su lugar las UIGraphicsBeginImageContextWithOptions. El proceso para usar esta función es el mismo que para la función UIGraphicsBeginImageContext:
- Llame a UIGraphicsBeginImageContextWithOptions para crear un contexto de mapa de bits (con el factor de escala apropiado) y empújelo en la pila de gráficos.
- Use las rutinas UIKit o Core Graphics para dibujar el contenido de la imagen.
- Llame a UIGraphicsGetImageFromCurrentImageContext para obtener el contenido del mapa de bits.
- Llame a UIGraphicsEndImageContext para que aparezca el contexto de la pila.
Por ejemplo, el siguiente fragmento de código crea un mapa de bits de 200 x 200 píxeles. (El número de píxeles se determina multiplicando el tamaño de la imagen por el factor de escala).
UIGraphicsBeginImageContextWithOptions(CGSizeMake(100.0,100.0), NO, 2.0);
Véalo aquí: Soporte de pantallas de alta resolución
Las coordenadas se expresan en puntos, no en píxeles. contentScaleFactor
define la relación entre el punto y los píxeles: si es 1, los puntos y los píxeles son iguales, pero si es 2 (como las pantallas de retina) significa que cada punto tiene dos píxeles.
En el dibujo normal, trabajar con puntos significa que no tiene que preocuparse por las resoluciones: en iphone 3 (scaleFactor 1) y iphone4 (scaleFactor 2 y 2x resolución), puede usar las mismas coordenadas y código de dibujo. Sin embargo, si está dibujando una imagen (directamente, como una textura ...) y solo está utilizando coordenadas (puntos) normales, no puede confiar en que el píxel al mapa de puntos es de 1 a 1. Si lo hace, entonces cada píxel de la imagen se corresponderá con 1 punto pero 4 píxeles si scaleFactor es 2 (2 en la dirección x, 2 en y), por lo que las imágenes podrían volverse un poco borrosas
Trabajando con CATiledLayer
puede obtener algunos resultados inesperados con scalefactor 2. Supongo que tener UIView
un UIView
contentScaleFactor==2
y la layer a contentScale==2
confunde el sistema y algunas veces multiplica la escala. Tal vez algo similar sucede con Scrollview.
Espero que esto lo aclare un poco.