El contenido de ScivFactor de UIView depende de la implementación de drawRect :?

Me he tropezado con algo extraño. Parece que el contentScaleFactor UIView de contentScaleFactor UIView es siempre 1, incluso en los dispositivos Retina, a less que implementes drawRect: Considere este código:

 @interface MyView : UIView @end @implementation MyView - (id) initWithFrame: (CGRect) frame { self = [super initWithFrame: frame]; if (self) { NSLog(@"%s %g %g %g", __PRETTY_FUNCTION__, self.contentScaleFactor, self.layer.contentsScale, [UIScreen mainScreen].scale); } return self; } - (void) didMoveToWindow { if (self.window) NSLog(@"%s %g %g %g", __PRETTY_FUNCTION__, self.contentScaleFactor, self.layer.contentsScale, [UIScreen mainScreen].scale); } @end 

En un dispositivo Retina imprime lo siguiente:

 -[MyView initWithFrame:] 1 1 2 -[MyView didMoveToWindow] 1 1 2 

Si agrego una implementación vacía de drawRect: así:

 - (void) drawRect: (CGRect) rect { } 

funciona como se espera:

 -[MyView initWithFrame:] 2 2 2 -[MyView didMoveToWindow] 2 2 2 

Por lo tanto, parece que realmente no importa si la vista está en cualquier jerarquía de vista y en qué tipo de pantalla se muestra. Lo único que sí importa es si la vista implementa drawRect: o no.

¿Es un error o una característica? Sé que puedo cambiar didMoveToWindow como se muestra a continuación para solucionarlo

 - (void) didMoveToWindow { if (self.window) self.contentScaleFactor = self.window.screen.scale; } 

pero el comportamiento pnetworkingeterminado todavía me molesta.

Puede preguntar por qué necesito contentScaleFactor en absoluto si no dibujo nada. Eso es porque acabo de establecer self.layer.contents en una image ya preparada y luego estiro la image con contentStretch . Sin embargo, la image no se estira correctamente en los dispositivos Retina a less que contentScaleFactor esté configurado correctamente, aunque se use una image @2x . Para ser precisos, funciona correctamente a less que se use una image @2x . Esto es, supongo, un error.

¿Alguien puede compartir su idea de por qué contentScaleFactor comporta de esta manera? ¿Es específico solo para iOS 5?

Presumiblemente, si no anula drawRect: entonces UIKit sabe que una UIView no dibuja nada, por lo que toma el caso (presumiblemente) rápido de tener una capa que tiene una escala de contenido de 1. Tan pronto como anula drawRect: aunque , sabe que necesita configurar una capa que sea de la escala de contenido correcta en la que puede dibujar si así lo desea. No sabe que no hace nada en drawRect: aunque no puede hacer la misma suposition que antes.

De hecho, todo lo que se alude en los documentos:

Para las vistas que implementan un drawRect personalizado: método y están asociadas a una window, el valor pnetworkingeterminado para esta propiedad es el factor de escala asociado con la pantalla que muestra actualmente la vista.

¿Por qué no solo anulas drawRect: y en eso, dibuja tu image? O probablemente podría salirse con lo que está haciendo actualmente y tener un talón drawRect: Teniendo en count lo que dicen los doctores, diría que es perfectamente razonable asumir que continuará funcionando y que es correcto.

Las tecnologías de dibujo nativas, como Core Graphics, tienen en count el factor de escala actual. Por ejemplo, si una de sus vistas implementa un método drawRect: método, UIKit establece automáticamente el factor de escala para esa vista en el factor de escala de la pantalla. Además, UIKit modifica automáticamente la matriz de transformación actual de cualquier context gráfico utilizado durante el dibujo para tener en count el factor de escala de la vista. Por lo tanto, cualquier contenido que dibuje en su método drawRect: se escala de manera apropiada para la pantalla del dispositivo subyacente.