About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Oct

    5

    从 iOS 升级到 7 以后的版本时,AIR 最常见的问题是由状态栏引起的。在 iOS 7 以前的版本中,如果是在全屏状态下,APP 的状态栏是真正的不可见的,但在 iOS7 以后的版本中,会发现它的状态栏是一个透明状态栏并且浮动在 APP 界面上,并且舞台的分辫率尺寸发生变化(由原先的不包含状态栏区域,变成包含状态栏的区域部份),如果没有做自适应处理,那么界面元素将有可能被拉伸,或界面元素与状态栏的文字重叠等,但这些还都只是小问题。

    最严重的问题还在于状态栏还可能引起 Starling 丢失 Context,比如:在全屏状态的 APP 中,调用 CameraRoll 浏览照片,此时 CameraRoll 本身会包含状态栏,当从 CameraRoll 界面返回到 APP 界面时,APP 实际上包含了状态栏的显示和消失的过程,而这个过程又其实包含了 AIR 生成一个新的 Stage3D context 的过程(Starling 基于 Stage3D),并且这个过程导致了原先 Starling context 的丢失。

    虽然官方的 API 手册中只是建义在安卓和 Windows 系统中设置 handleLostContext 为 true 防止纹理意外丢失(比如睡眠状态返回,旋转屏幕等等),而事实上在 iOS 中如果像上面这种 CameraRoll 调用的情况下,使用 Starling 最新版本同样也要设置 handleLostContext 为 true(尽管这可能会造成较大的内存使用来缓存纹理)。这并不是一个最好的建义,如果开发者足够仔细,会发现从 CameraRoll 界面返回时,因为重新创建纹理的原因,所以会导致整界面刷新,在视觉上有“瑕疵”(丢了 Context 的舞台什么都没有一闪而过)。

    不知道 Adobe 未来的 AIR SDK 中是否会修改这个问题,或不知道要多久才能修正这个问题。所以除了 handleLostContext 设置为 true 防止意外的丢失 Context 外,推荐将 -app.xml 中的 fullScreen 设为 false,防止由于状态栏的原因造成 Context 丢失的问题(除非你正在开发的 APP 不是基于 Starling 的,或始终与状态栏的显示与消失无关如果状态栏文字需要在 APP 运行期间动态的修改颜色,推荐一个能动态修改状态栏文字颜色的 ANE 文件:IOSStatusBarAne-master.zip