iOS Orientation bug
Every September means pain for iOS developers- you need to make sure your old apps/code run on the new iOS system/Apple devices, as well as update the iOS SDK, deprecate your code, API, etc. And ready to comply with whatever requirements Apple asks for.
This bug I encountered is iOS 6.0 only, on which Game Center has portrait view only. When API is being called, it will crash on landscape only games.
Xcode will error out something about autoRotate which isn't the real cause.
People say apple fixed this bug for later version of iOS 6.
The workaround I came up, is to support Portrait view in UIWindow, but disable it in the rootViewController by setting up the landscape mask.
In order to access a UIApplication, we need to do it from UIApplicationDelegate, the delegate class has a UIWindow, and the UIWindow has a rootViewController (after iOS 4.0), and you can add your UIView as subview to rootViewController.
(This is quite normal for any 2D based display system, you will need to have a display container hierarchy anyway.)
Everything works fine, problem seems to solved...
However, google mobile ad sdk interstitial triggered this rotation malfunction. Some interstitials have both landscape view and portrait view, even though the interstitial starts with the current orientation, if you rotate the screen to portrait view, the interstitial will automatically rotate to portait view. Because portrait view is possible in UIWindow.
Now when you close the ad, the game mistakely got rotated, even tho the rootViewController only has landscape views.
For some reason interstitials are added to UIWindow directly, instead of being added to rootViewController like banners are. Part of the reason might be that Google Mob Ad Sdk interstitial class is not derived from UIViewController, it derives directly from NSObjects. So I've tried to add the InterstialViewController directly to rootViewController and presentViewController, now the interstitial is cut off and only shows up 1/3 of the screen. In another trial, the UI input is disabled. After all, both ways ended up with the interstitial being rotatable, which causes the game play to rotate.
Some people suggest use UINavigationController and set those rotation related functions. It wouldn't work because this app is really really really f**king old, it isn't even using Storyboard at all. Tried to change class declaration for rootViewController or interstialViewController, no luck.
What makes it even harder to debug is, if this is a native or modern iOS app, i could do everything in the project, adding flag checks. But this app is using our internal framework, AppDelegate is a static libarary class, otherwise i could add a game center flag check directly and control the supportedOrientation for window accordingly.
Plus, certain functions, for example the accelerometer and rotation function made by the framwork group seems to be working in parallel with the iOS system level function, but they are out of sync, the core functions cannot detect the portrait orientation, it simply ignores it!
So after digging out more stackoverflow posts, people mentioned using setOrientation, or manually change the rotation. This is an unofficial/non-public interface. We cannot depend everything on iOS itself. So my final solution for this is: in willDissmissInterstitial function, manually rotate the window 90 degree secretly. This works fine, nobody knows until i tell them. (btw, if you put it in didDismiss function, you will notice a glitch)
iOS Orientation bug的更多相关文章
- 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(中)- IOS不为人知的Bug
前言: 话说昨晚还是前晚,写了一篇:讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(上) 文章写到最后时,多了很多莫名奇妙的问题!!! 为了解决了这些莫名奇妙的问题,我又战斗了2 ...
- iOS Orientation获取
[iOS Orientation获取] 1.[[UIDevice sharedInstance] orientation] 必须调用beginGeneratingDeviceOrientationNo ...
- IOS Orientation, 想怎么转就怎么转~~~
此博文主要针对IOS应用, 是屏幕旋转相关问题的一个总结. 主要内容有: IOS5,6,7不同版的适配. 强制旋转和自动旋转. 博客: http://www.cnblogs.com/jhzhu 邮箱: ...
- iOS 证书Bug The identity used to sign the executable is no longer valid 解决方案
现象:The identity used to sign the executable is no longer valid Please verify that your device’s cloc ...
- ios 刷新BUG
UItextView edited = yes ; 导致 刷新奇怪: 有些方法不要自己调用: 可能会破坏组件自己的生命周期: 建议模块化开发组件,自己处理自己的事:
- ios模拟器bug
Error: xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Libra ...
- iOS开发-Bug锦囊
duplicate symbols for architecture armv7 今天修改了自己项目的部分代码,发现XCode编译的时候报错:duplicate symbols for archite ...
- ios问题bug收录——1
**[2713:59682] *** Assertion failure in -[MBProgressHUD show:], /Users/lu/Desktop/****/Pods/MBProgr ...
- VUE: 移动端长按弹出确认删除地址(后面测试发现IOS有BUG,后面有更新随笔,更新后的亲测有效)
收货地址的删除方式可能有很多种,我目前见过的暂时只有两种(1.在编辑页删除 2.长按某一条收货地址弹出是否删除地址) 在开发的项目上要求第二种删除方法,于是记录一下我写的代码 ~ 1.首先,在移动端 ...
随机推荐
- 160个crackme-之Afkayas.1
工具: OD 环境: windows XP 运行: 我们先运行一下这个小程序,看看它到底是干什么的.运行后发现它要我们输入Type In your Name 和Type In your Serial ...
- Java期末设计(十三周)
一.项目完成计划 十三周和十四周完成用户交互界面的设计(1.登陆界面2.订票以及查询界面3.用户管理界面4.退票界面): 十三周完成登陆界面,十四周完成订票以及查询界面,用户管理界面和 ...
- GDB配置与.gdbinit的编写
GDB配置与.gdbinit的编写 当 GDB(即 GNU Project Debugger)启动时,它在当前用户的主目录中寻找一个名为 .gdbinit 的文件:如果该文件存在,则 GDB 就执行该 ...
- error MSB6006: “CL.exe”已退出,代码为X —— 的解决办法
错误 : error MSB6006: “CL.exe”已退出,代码为X . 解决方法: 1.有少可能是执行目录引起的. 参考 http://bbs.csdn.net/topics/370064083 ...
- 适配iOS10 的相关权限设置
解决办法(fix method):在info.plist —Source Code中添加UsageDescription相关的key, 描述字符串自己随意填写就可以,但是一定要填写,不然会引发包无效的 ...
- Xcode中的Version和Build的区别
Version( 应用程序发布版本号 ) Version对应的是CFBundleShortVersionString. Version 一般由产品部门确定,版本号是由分隔的整数组成的字符串,一般有2段 ...
- linux内核学习之二 一个精简内核的分析(基于时间片轮转)
一 实验过程及效果 1.准备好相关的代码,分别是mymain.c,mypcb.h,myinterrupt.c ,如下图,make make成功: 在qemu创建的虚拟环境下的运行效果:(使用的命令 ...
- 【转】silverlight telerik RadGridView 列头显示其他控件
<telerik:GridViewDataColumn DataMemberBinding="{Binding target_id}" IsFilterable=" ...
- 使用javaScript实现简单倒计时功能
效果如下: <div class="warp"> <p id="txt">距离”十一“国庆放假还有:</p><br&g ...
- margin:0 auto 与 text-align:center
1.text-align:通过指定行框与哪个点对齐,从而设置块级元素内文本的水平对齐方式; text-align:center 设置文本或img标签等一些内联对象的居中. 2.m ...