首页 >【Three20研究院之应用开发】 > Three20研究院之解决真机IOS6在Xcode4.5下无法编译与IOS设备自动旋转问题(九)
2012
10-08

Three20研究院之解决真机IOS6在Xcode4.5下无法编译与IOS设备自动旋转问题(九)

之前一直都是在Xcode4.4下使用Three20开发框架,今天升级到4.5了发现在IOS6下无法将程序编译到真机上,还有就是Three20在IOS6下旋转的代码全部失灵了,非常奇怪。今天抽了一点时间研究了一下,本文仅作为自己备份!

首先我们解决无法编译的问题。

three20的开发包我用的是gitbug上的 https://github.com/facebook/three20 官网上的Three20迟迟不见更新,无奈啊!

找到UIViewAdditions.h 和UIViewAdditions.m这两个类,将 #ifdef DEBUG 标签全部改成  #ifdef DEBUG_TOUCHES 

像这里写的一样 一共三处 https://github.com/cogenta/three20-1.0.5/commit/be70e1ff3965c0ff4f7598bf5213349629a27540 

这一步做完后,在IOS6的模拟器上已经可以运行Three20程序了,可是还是不能编译到真机!如下图所示,我们需要把Valid Architectures 的属性改成成 armv6 armv7  修改完毕后即可正常编译在真机。

 

Three20研究院之解决真机IOS6在Xcode4.5下无法编译与IOS设备自动旋转问题(九) - 雨松MOMO程序研究院 - 1

 

下面我们来解决在IOS6中如何让Three20设备旋转

在AppDelegate中修改如下代码

 

    //创建导航条
    TTNavigator* navigator = [TTNavigator navigator];
    navigator.persistenceMode = TTNavigatorPersistenceModeAll;

    //------------注意加入下面的代码------------
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
     //------------注意加入上面的代码------------
    navigator.window = self.window;

TTURLMap* map = navigator.URLMap;

 接着在切换ViewController的时候加入代码

    if (![navigator restoreViewControllers])
    {
        //打开上面设置的url
        [navigator openURLAction:[TTURLAction actionWithURLPath:@"tt://Tab"]];
        //------------注意加入下面的代码------------
        self.window.rootViewController = navigator.rootViewController;
        //------------注意加入上面的代码------------
    }

 接着在TTNavigationController.m中加入下面两行代码,TTNavigationController是Three20的源码,大家在Xcode中搜索一下这个关键字即可看到、。

- (BOOL)shouldAutorotate{
    return YES;
}
-(NSUInteger)supportedInterfaceOrientations{
    return [self.topViewController supportedInterfaceOrientations];
}

 

如果你需要旋转的是UITabBarController那么加入如下代码

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [self.selectedViewController supportedInterfaceOrientations];
}

-(BOOL)shouldAutorotate
{
    return YES;
}

 

如果你需要旋转的是ViewController那么加入如下代码

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAllButUpsideDown;
}

-(BOOL)shouldAutorotate
{
    return YES;
}

 

OK 这样就可以完美解决了。不过毕竟这是我们手动修改Three20 ,还是希望Three20社区尽快更新,据说FaceBook的客户端要放弃使用Three20 不知道未来Three20还能走多远,观望中!!

本文参考内容 http://www.goodnewtiger.com/llf/cegeek/?p=61

还得在家继续呆两天,后天才能回北京。在家的日子每天睡眠都不好,现在又赶上国防学院开学,每天早上一大早就开始放音乐!!悲剧!!

 

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Three20研究院之解决真机IOS6在Xcode4.5下无法编译与IOS设备自动旋转问题(九)》有 98 条评论

  1. 一线天说:

    momo大哥,我想请教下为什么我的xcode创建single view应用不能在didFinishLaunchingWithOptions中自动生成下面所示代码,我的是xcode5.1.1的版本,我看他们4.3.6的就可以,难道是我的版本太高的原因吗self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

  2. 不能发布在别的平台上的。

  3. 李卫平说:

    momo:《unity 3d游戏开发》第七章的07_01程序在源程序中可以使用,我们自己照样做,并且把源程序复制粘贴,但是不能加载到摄像机上,程序不能运行,恳momo给予指点。

留下一个回复

你的email不会被公开。 必填项已用 * 标注。