2011-03-11 13 views
17

Saludos,¿Cuál es el secreto detrás de "contentScaleFactor" de UIView cuando se utiliza con CATiledLayer?

Estoy trabajando en una aplicación inspirada en el ejemplo "ZoomingPDFViewer" que viene con el iOS SDK. En algún momento me encontré con el siguiente fragmento 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; 

traté de aprender más sobre contentScaleFactor y lo que hace. Después de leer todo lo que mencionaba de la documentación de Apple, busqué en Google y nunca encontré una respuesta definitiva a lo que realmente hace.

Aquí hay algunas cosas que tengo curiosidad por saber:

  1. Parece que contentScaleFactor tiene algún tipo de efecto en el contexto gráfico cuando el contenido de un UIView/de CALayer se están elaborando. Esto parece ser relevante para pantallas de alta resolución (como la pantalla Retina). ¿Qué tipo de efecto tiene realmente contentScaleFactor y en qué?

  2. Al usar un UIScrollView y configurarlo para ampliar, digamos, mi contentView; todas las subvistas de contentView también se están escalando. ¿Como funciona esto? ¿Qué propiedades modifica UIScrollView 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 "under the hood"? Quiero entender cómo funciona para poder escribir el código correcto.

¡Cualquier pista y explicación es muy apreciada! :)

Respuesta

6

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 lo mismo, pero si es 2 (como retina muestra) 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 de 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 usa coordenadas normales (puntos), no puede confiar en que el mapa de punto a punto sea 1 a 1. Si lo hace, entonces cada píxel de la imagen corresponderá a 1 punto pero 4 píxeles si scaleFactor es 2 (2 en dirección x, 2 en y) para que las imágenes se vuelvan un poco borrosas

Al trabajar con CATiledLayer puede tener algunos resultados inesperados con scalefactor 2. Supongo que tiene UIView a contentScaleFactor==2 y la capa a contentScale==2 confunde el sistema y, a veces multiplica la escala. Tal vez sucede algo similar con Scrollview.

la esperanza que esto aclare un poco

+0

Gran respuesta, aquí es un resumen actualizado y puntos, factores de escala y resoluciones http://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions –

2

Apple tiene una sección acerca de esto en su página "Apoyo a pantallas de alta resolución" en la documentación dev IOS.

La página dice:

actualización de su código de dibujo personalizado

Al hacer cualquier dibujo personalizado en su aplicación, la mayoría de las veces que no es necesario preocuparse por la resolución de la pantalla subyacente . Las tecnologías de dibujo nativas aseguran automáticamente que las coordenadas que especifique correctamente en el mapa de espacio de coordenadas lógicas sean píxeles en la pantalla subyacente. A veces, sin embargo, es posible que necesite para 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 proporcionar la ayuda que necesita para hacer su dibujo correctamente.

Creación de alta resolución de imágenes bitmap programación Si actualmente utiliza la función UIGraphicsBeginImageContext para crear mapas de bits, es posible que desee para ajustar su código de tomar factores de escala en cuenta. 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 , una imagen creada con esta función podría no mostrar como suave cuando se procesa. Para crear una imagen con un factor de escala distinto de 1,0, utilice los UIGraphicsBeginImageContextWithOptions lugar. El proceso para el uso de esta función es la misma que para la función UIGraphicsBeginImageContext: UIGraphicsBeginImageContextWithOptions

  1. llamada para crear un mapa de bits contexto (con el factor de escala apropiado) y lo empujan en la pila gráficos.
  2. Uso UIKit o núcleo de gráficos rutinas para dibujar el contenido de la imagen de .
  3. UIGraphicsGetImageFromCurrentImageContext llamar para obtener contenido del mapa de bits.
  4. UIGraphicsEndImageContext llamada a estallar 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 es determina multiplicando el tamaño de la imagen por el factor de escala .)

UIGraphicsBeginImageContextWithOptions(CGSizeMake(100.0,100.0), NO, 2.0); 

lo ve aquí: Supporting High-Resolution Screens

+4

cuenta que aprobar 0.0 como los resultados de la escala en UIGraphicsBeginImageContextWithOptions: usando el contentScaleFactor de la pantalla principal del dispositivo. En mi opinión, esta es la opción más fácil para hacer el mejor uso de cualquier dispositivo de resolución en el que se encuentre. Esto usará automáticamente 1.0 para dispositivos "normales" y 2.0 para dispositivos retina. ¡Bonito y fácil! – PapillonUK

Cuestiones relacionadas