`
woainike
  • 浏览: 78221 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

iOS6对于shouldAutorotateToInterfaceOrientation的改动以及其他一些窗口相关细节

 
阅读更多

OS6正式版发布当天博主我就更新了,随后也更新了对应的XCode以及iOS SDK,更新到了4.5 (4G182)。然后更新原有4.4 iOS5 SDK的项目,目前最主要的发现就是iOS6对于app屏幕朝向支持以及自动旋屏时的处理方式的变动。

简而言之就是iOS6下的

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
	return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}

 这个不会再被调用,取而代之的是这俩个组合:

- (BOOL)shouldAutorotate
{
	return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
	return UIInterfaceOrientationMaskLandscape;
}

 当然,为了保持对旧版本系统行为的兼容性,不要删掉不用的那个调用。另外还有一个这个preferred朝向也可以加上

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
	return UIInterfaceOrientationLandscapeRight;
}

 当我替换完这俩个操作后尝试运行app,发现会报如下的异常:

Terminating app due to uncaught exception ‘UIApplicationInvalidInterfaceOrientation’, reason: ‘Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES’

经查发现导致此异常的原因是app再info.plist中指定的屏幕朝向没有portrait,也就是只支持landscape横屏,但是app集成了Game Center应用,而Game Center触发的登录界面只支持竖屏显示(这点有开发帐号的朋友可以到苹果官方开发论坛上看下,有个苹果官方人员发的证实贴,由于现阶段的NDA就不转了),解决这个问题的方法就是再应用的delegate中加入如下回调:

 

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        return UIInterfaceOrientationMaskAll;
    else  /* iphone */
        return UIInterfaceOrientationMaskAllButUpsideDown;
}

 

这样就可以再不改变info.plist中的设置的前提下,兼容gamecenter的竖屏登录问题。

顺带一提,对于Game Center排行等界面的旋屏朝向限制方法

@implementation GKLeaderboardViewController(Landscape)

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscapeRight|UIInterfaceOrientationMaskLandscapeLeft;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationLandscapeRight;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}

@end

 

这个时候确实感到objective-c的category之方便啊,呵呵。

 

再有一个问题就是window的rootViewController问题,在iOS6下,必须通过setRootViewController指定根视图控制器,否则didFinishLaunchingWithOptions结束后会报必须指定根视图控制器的错误。网上看到有人提到在iOS6下addSubview的方法将不再起作用,而必须使用指定rootViewController的方式,而我实际测试时还发现了另外一个小问题,就是在切换view的时候,比如用MPMoviePlayerViewController播放intro视频,然后再切换到游戏OpenGL视图时的addSubView和removeFromSuperview的交替会出现一些奇怪的GL视图朝向错误问题,而且也找不到任何相关旋屏的log输出,最后发现只要是用了iOS6的SDK就必须调用setRootViewController,iOS6以前的系统还需要额外调用addSubview,这样就不会出现那种切换view后的诡异问题了,至少我目前找到的解决方法是这样,不知是否另有玄机?附上改后的根据系统版本号执行不同切换方式的简单代码:

if ([[UIDevice currentDevice].systemVersion floatValue]<6.0)
{
	// 高兼容性的做法
	[self.window setRootViewController:self.viewController];
	[self.window addSubview:self.viewController.view];
}
else
{
	[self.window setRootViewController:self.viewController];
}
[self.viewController.view setNeedsDisplay];

 最后再爆料一个屏幕初始朝向的问题,我们知道,设定屏幕初始朝向的方法是再info.plist中指定Initial interface orientation项,而我发现无论怎么设置,横屏都只能以landscape-left的方式启动,就是按钮在左边那种,不管是升级的旧项目,还是新建的项目均是如此,不知是否有朋友也遇到了这个问题?

 
分享到:
评论

相关推荐

    ios6系统图标原生

    "ios6系统图标原生"是指iOS 6操作系统中,苹果公司官方设计的一系列应用程序图标。这些图标通常遵循苹果的Human Interface Guidelines (HIG),确保一致性和用户体验的质量。在iOS 6中,这些图标的设计风格和色彩搭配...

    ios项目适配ios6 ios7

    对于兼容iOS6的项目,可能需要保留旧的图片命名方式,并且在代码中适当地选择加载。 7. UIAppearance:UIAppearance API允许全局设置控件的外观,如字体、颜色和边框等。利用这个API可以统一整个应用的视觉风格,...

    iOS6 编程实战(英)

    通过阅读《iOS 6编程实战》,开发者不仅可以掌握iOS 6时代的开发技术,还能了解到当时的一些最佳实践,为后续的iOS版本升级和学习打下坚实的基础。虽然如今iOS已经更新到了更高的版本,但理解历史版本的知识有助于...

    IOS7呈现IOS6水滴刷新效果修正版本

    "IOS7呈现IOS6水滴刷新效果修正版本"这个项目聚焦于为iOS应用添加一个独特的刷新指示器,模仿了iOS 6中的水滴下落动画效果,并针对iOS 7及64位设备进行了优化。这种视觉反馈设计旨在提升用户体验,让用户在下拉刷新...

    IOS6 in Practice

    7. **新API和框架**:iOS6还引入了其他新API,如Core Data的多线程支持,以及Core Image和AVFoundation的增强,使得图像处理和多媒体功能更为强大。 8. **Siri**:Siri在iOS6中支持更多的实用功能,如体育赛事查询...

    iphone越狱 ios6

    iphone越狱 ios6很好用 ios6.1.6也可以 ios6系列越狱

    iPhone 5版iOS 6 GUI PSD源文件发布

    《iOS 6 GUI PSD源文件在iPhone 5应用设计中的重要性及使用指南》 对于致力于iOS应用设计的专业人士来说,掌握最新的设计工具和技术是至关重要的。本文将深入探讨iPhone 5版iOS 6 GUI PSD源文件的重要性和使用方法...

    iOS9.3.2,iOS10(Xcode_8_beta6)SDK支持xocde5、6

    本资源集中的标题和描述提到了iOS9.3.2和iOS10的SDK,以及它们与Xcode 5、6的兼容性,这对于那些希望在旧版本Xcode上开发或调试新版本iOS应用的开发者来说非常有价值。 首先,iOS9.3.2 SDK是Apple为开发针对iOS...

    jQuery UI iOS6移动主题zip

    该主题包的核心在于其CSS样式和可能包含的一些JavaScript扩展,它们被设计用来模仿iOS6的界面元素,如按钮、滑块、对话框、工具提示等。jQuery UI的组件包括但不限于: 1. **Dialog(对话框)**:模拟iOS中的弹出...

    iOS6 编程实战 源码

    9. **GameKit框架**:对于游戏开发者,GameKit提供了一些游戏相关的服务,如Game Center,用于排行榜、成就系统和多人游戏。 10. **测试与调试**:iOS6中Xcode的测试和调试工具也得到了增强,包括Instruments的使用...

    ios6开发进阶与实战源码

    《iOS6开发进阶与实战源码》是一个针对苹果iOS6平台深入学习和实践的资源集合,主要面向已经掌握基础iOS开发的开发者,旨在提升他们的技能并提供实战经验。这个资源包,名为"MoreiOS6Development-master",包含了...

    ios6UIKitpsd

    "teehanlax - iOS 6 - iPhone.psd"是一个典型的例子,它是由知名设计工作室Teehan+Lax提供的,这个文件可能包含了iOS 6时期iPhone应用的标准界面模板,包括导航栏、工具栏、图标以及其他交互元素的可定制设计层。...

    Beginning iOS 6 Development Exploring the iOS SDK

    《初识iOS 6开发:探索iOS SDK》是针对苹果移动平台开发的一本入门级教程,旨在引导读者深入了解iOS开发环境和工具,掌握Objective-C语言基础,并熟悉Apple的开发框架。这本书面向的是对iOS编程感兴趣的初学者,通过...

    一步一步学习 iOS 6 编程

    《一步一步学习 iOS 6 编程》是一本针对初学者的iOS开发教程,特别适合...总的来说,《一步一步学习 iOS 6 编程》是一本全面覆盖iOS开发基础知识的教程,对于想要踏入iOS开发领域的初学者来说,是一份非常宝贵的资源。

    IOS7呈现IOS6水滴刷新效果

    "IOS7呈现IOS6水滴刷新效果"这个主题聚焦于如何在iOS7系统中实现类似iOS6的水滴刷新动画,这是一种用户界面(UI)交互的设计元素,旨在提高用户的参与度和满意度。在iOS6中,苹果引入了下拉刷新(Pull-to-Refresh)...

    彩虹猫高仿iOS6.mtz

    彩虹猫高仿iOS6.mtz

    ios 6私有api头文件

    这些头文件包含了iOS 6私有框架中的类定义、方法声明和其他相关接口,它们是开发者可以用来探索和利用私有API的入口。 描述中提到的“最新的ios 6私有api头文件”意味着这些文件反映了iOS 6发布时的最新私有API状态...

    iphone 5 ios6 状态栏

    在iOS 6时代,虽然Apple并没有开放系统级别的自定义状态栏功能,但一些开发者通过越狱方式创建了插件,允许用户修改状态栏的外观和行为。这些插件通常需要在Cydia上安装,并且只适用于已越狱的设备。然而,需要注意...

    iOS6通用跳激活文件

    在压缩包中的"System"文件,可能包含了一些与系统核心组件相关的文件。在iOS系统中,System目录下包含了操作系统的核心服务、库和框架,这些都是iOS正常运行所必需的。不过,直接修改或替换这些系统文件通常需要深入...

Global site tag (gtag.js) - Google Analytics