在安装新应用程序后,shouldAutorotateToInterfaceOrientation在首次启动时不起作用

时间:2010-05-17 19:03:54

标签: iphone notifications orientation autorotate

当我正在使用的应用程序通过Ad-Hoc通过iTunes安装或直接内置到设备时,第一次启动时,我的应用程序中响应方向更改的唯一视图控制器无法接收传入景观参数调用shouldAutorotateToInterfaceOrientation:;调试显示它只被调用为肖像。每次后续发布都会像我期望的那样 - 也就是说,shouldAutorotateToInterfaceOrientation:调用了横向和纵向参数。这种确切的行为可以在iPhone模拟器,iPhone和iPod touch上看到。

所以我的问题是:为什么第一次启动应用时的方向通知会与后续每次启动时的方向通知不同?我错误地认为除了回应shouldAutorotateToInterfaceOrientation:之外我无法控制方向变化吗?

在相关的ViewController中:

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

以及viewDidLoadviewDidUnload内部(分别):

 [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

 [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];

2010年7月6日更新:

仍然没有运气解决问题。我放弃了这个问题一段时间后回到它,我仍然在完全不同的情况下看到问题。任何人吗?

2010年7月13日更新:

来自Apple的View Controller Programming Guide

“...窗口对象完成了与更改当前方向相关的大部分工作。[...]具体来说,它适用于视图控制器,其根视图最近被添加到窗口或在窗口中显示换句话说,窗口对象仅适用于显示视图的最前面的视图控制器......“

我在第一次启动时将根视图控制器添加到窗口的方式与之后的每次启动不同,所以我想也许它与此有关。我还没有追溯到这里,但只是一个想法。

在此更新时,这个东西有大约175个观看次数......没有人有甚至是最遥远的模糊建议?来吧,扔东西。我现在愿意接受任何猜测或建议。我不在乎它是愚蠢的模糊还是可能无关紧要。

3 个答案:

答案 0 :(得分:2)

从未解决过这个问题 - 在我有机会之前,我离开了我遇到它的公司。但是,在我离开的时候,我有很好的领先优势。我联系了Apple DTS关于这个问题,他们注意到为了使自动旋转正常工作,视图堆栈中与自动旋转相关的所有ViewControllers必须调用方法实现中的超级方法(即从ViewController的{{1}中调用[super viewDidLoad] }})。我不记得他们准确引用了哪些方法,但是可能值得一试,以确保您在适当的时候正确地调用viewDidLoad

[编辑]如果有人可以确认这一点,我会将其标记为已接受的答案。谢谢!

答案 1 :(得分:0)

还要确保设置:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return YES;}

在应用中的 ALL ViewControllers.m中,而不只是您正在处理的一个(如果您有多个)。我正在努力尝试将它用于FirstViewController,但无论如何它都无法工作。一旦我将上面的代码添加到所有四个视图控制器,它就开始工作得很好(全部四个)

答案 2 :(得分:0)

我遇到了类似的问题 - UIDevice.h标头将endGeneratingDeviceOrientationNotifications和beginGeneratingDeviceOrientationNotifications列为“可嵌套”。事实证明我对这些方法的调用不平衡。

我通过以下更改快速解决了这个问题,开始生成设备定位通知:

if (![[UIDevice currentDevice] isGeneratingDeviceOrientationNotifications])
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];