面向在IPad中横向启动应用程序的一个问题。 我开发了IPhone应用程序,后来我移植到IPad。
我已经在info.plist中设置了关于方向的设置
[ UISupportedInterfaceOrientations~ipad ] to support all orientation UIInterfaceOrientationPortrait , UIInterfaceOrientationPortraitUpsideDown , UIInterfaceOrientationLandscapeLeft , UIInterfaceOrientationLandscapeRight.
但是当我在横向模式下启动IPad应用程序时,它总是以potrait模式启动。
沿着这个
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{ return YES; }
帮助我,如果我错过了这个......
谢谢,
Sagar的
答案 0 :(得分:10)
这里也是我发现的东西:如果你在第一个插槽中设置了另一个方向的支持接口方向,则会忽略在info.plist中设置初始界面方向!将初始方向放在那里 - 模拟器将正确启动,应用程序也将如此。这让我疯了很长时间!
答案 1 :(得分:9)
将UISupportedInterfaceOrientations放入-Info.plist中,并为您支持的每个方向设置。这用于查看应用程序可以从哪个方向开始。从那时起,它将询问您的视图控制器。
答案 2 :(得分:5)
Sagar - 我有同样的问题,但能够解决它。
和你的一样,我的应用程序是作为iPhone应用程序启动的,我使用XCode向导将其“升级”为通用应用程序。我注意到,当在真实的iPad上运行时,从横向开始,应用程序将以纵向开始,然后可以旋转到横向。在模拟器上,从横向开始,应用程序将从横向开始,然后模拟器将旋转为纵向。
在iPad上,我的应用程序是一个左右两侧带有TabBarControllers的拆分视图应用程序。每个选项卡都是一个视图控制器,它向shouldAutoRotateToInterfaceOrientation返回YES。
我注意到一个全新的向导生成的带有splitviewcontroller的简单案例,Universal app没有出现这个问题。
我在应用程序和简单案例之间发现的差异是我没有将我的splitview-controller的视图添加到applicationDidFinishLaunchingWithOptions中的应用程序窗口。相反,我在这个阶段显示了一个“加载”视图,然后在初始化线程完成后,我添加了我的splitviewcontroller的视图(并隐藏了“加载”视图)。
当我在调用applicationDidFinishLaunchingWithOptions期间将我的splitviewcontroller的视图添加到应用程序窗口时,一切正常。
从applicationDidFinishLaunchingWithOptions返回时必须有一些魔法???
你的应用程序是否与我的类似,因为它在applicationDidFinishLaunchingWithOptions期间没有将主视图控制器的视图添加到窗口中?
答案 3 :(得分:1)
正如许多帖子所指出的那样,您必须使用支持的和初始的界面方向设置info.plist。然而,更大的问题是初始方向何时生效?当您的视图控制器收到“viewDidLoad”消息时,答案不是。我发现在运行iOS 5.0的iPad-1上,请求的初始方向仅在几个“shouldAutorotateToInterfaceOrientation”之后才生效 收到消息。(此消息将UIInterfaceOrientation参数传递给接收者。)此外,即使方向显示它处于横向模式,也可能不是!我发现确保视图处于横向模式的唯一方法是测试视图高度是否小于视图宽度。 对我有用的策略是在收到“viewDidLoad”消息时布置我想要的子视图,但是延迟实际将这些子视图添加到视图中,直到控制器收到有效的“shouldAutorotate ..”消息,其方向设置为Landscape模式。代码看起来像:
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
// N.B. Even when the interface orientation indicates landscape mode
// this may not really be true. So we insure this is so by testing
// that the height of the view is less than the width
if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
interfaceOrientation == UIInterfaceOrientationLandscapeRight)
{
CGRect viewBounds = [[self view] bounds];
if ( viewBounds.size.height < viewBounds.size.width )
[self addMySubViews];
return YES;
}
else
return NO;
}
Apple刚刚发布了iOS 5.1,因此这种行为可能已经发生了变化。但我希望这里的代码仍然有用。