Flex 4.5 Problemas mobilees de iOS para determinar la resolución real de la pantalla / escenario

Estoy teniendo un problema bastante grande. Espero que esto se deba a mi propia estupidez y no a un error de algún tipo. Tengo un código que necesita conocer las dimensiones de la pantalla. No he encontrado una forma confiable de hacer eso. Utilizando la versión de producción de Flash Builder 4.5 en dispositivos iPad 2 y iPhone4 / iPod Touch 4 iOS. En general, mi aplicación funciona muy bien, pero no puedo determinar el tamaño de la pantalla y la orientación en la hora de inicio del progtwig. Déjame explicarte los problemas que estoy teniendo:

Al ingresar a la function "init", la llamada por el evento ADDED_TO_STAGE, los valores de stage.stageHeight y stage.stageWidth son ambos 0.

Puedo consultar Capabilities.screenResolutionX y Capabilities.screenResolutionY, pero son INCORRECTOS. Tienen los valores X e Y sin procesar, pero independientemente de la orientación. Así, por ejemplo, empiezo en modo horizontal por pantalla ResolutionX contiene 768 (o lo que sea) en lugar de 1024.

Miro los valores de stage.width y stage.height y no tienen valores válidos.

Tengo una configuration de function onResize para EVENT.RESIZE, pero no se llama si la aplicación se inicia desde el dispositivo cuando ya está en modo horizontal. Si inicio la aplicación en modo vertical y luego gire, se llamará.

Entonces, mi pregunta es qué debo consultar al inicio de la aplicación para conocer el ancho real y la altura de la aplicación. Debe haber una forma de hacer esto, pero al parecer no está usando ninguno de los methods anteriores.

Por cierto, esto es en dispositivos iOS. No puedo decir cómo funciona en otros. He confirmado estos resultados imprimiendo los resultados y ejecutándolos en el depurador.

Anteriormente he tenido problemas con stageWidth y stageHeight que no dan los valores adecuados inmediatamente al iniciar, una forma fácil de evitar esto es esperar un par de frames antes de verificarlos.

Una opción es retrasar la initialization de su aplicación, algo parecido a lo siguiente:

private var _startup_delay:int = 10; public function Constructor(){ addEventListener(Event.ENTER_FRAME, handleEnterFrame); } public function handleEnterFrame(e:Event):void{ _startup_delay--; if(_startup_delay <= 0){ init(); removeEventListener(Event.ENTER_FRAME, handleEnterFrame); } } 

Otra opción es enviar un evento de cambio de tamaño falso y dejar que su código de rotation anterior lo ocupe una vez que haya transcurrido el retraso:

 public function handleEnterFrame(e:Event):void{ _startup_delay--; if(_startup_delay <= 0){ stage.dispatchEvent(new Event(Event.RESIZE)); removeEventListener(Event.ENTER_FRAME, handleEnterFrame); } } 

Respuesta corta :

La forma más fácil es usar las properties stage.fullScreenWidth y stage.fullScreenHeight .

Reportan correctamente el tamaño de la pantalla para cualquier orientación y cualquier plataforma en el momento de inicio (no es necesario esperar los events ADDED_TO_STAGE o RESIZE).

Más detalles :

En Android y Blackberry , AIR informa los mismos valores (y correctos) en cualquier momento cuando usa cualquiera de las siguientes properties:

  • stage.stageWidth & stage.stageHeight
  • Screen.mainScreen.bounds.width y Screen.mainScreen.bounds.height
  • stage.fullScreenWidth & stage.fullScreenHeight

En iOS , al inicio, las tres syntax dan tres resultados diferentes (los siguientes valores de ejemplo son para una aplicación que se ejecuta en iPad2 en modo horizontal):

  • stage.stageWidth / Height: el tamaño de etapa pnetworkingeterminado al iniciar un swf (500×375)
  • Screen.mainScreen.bounds: la resolución física de la pantalla en modo vertical (768×1024)
  • stage.fullScreenWidth / Height: la resolución de pantalla correcta en la orientación dada. (1024×768 – correcto)

Tenga en count que en iOS, el evento RESIZE se dispara dos veces cuando se inicia la aplicación, pero los valores son correctos solo la segunda vez (stage.stageWidth == stage.fullScreenWidth).

en el inicio de la aplicación,

 public function Main() { loaderInfo.addEventListener(Event.COMPLETE, _onComplete_loaderInfo); } private function _onComplete_loaderInfo(__e:Event):void { // I should now have access to stage.stageWidth/stage.stageHeight. } 

trabajo para get la pantalla res Me gustaría decir que no he hecho ninguna investigación sobre esto, solo estaba buscando algo más y encontré tu problema y simplemente comentando en voz alta. Ahora, no estoy diciendo que serán valores correctos, pero al less NO deberían ser cero.