应用程序不会在iPhone模拟器上旋转

时间:2012-10-03 13:38:18

标签: iphone objective-c ios xcode simulator

我想用iPhone 5分辨率测试我的应用程序,所以我正在使用模拟器。我的应用程序在支持的设备方向中具有纵向和2个横向方向,并且允许旋转的viewControllers将shouldAutorotateToInterfaceOrientation设置为YES。然而,当我在模拟器中旋转设备时,它不会像在设备上那样旋转。现在我只是使用标准的iPhone 4模拟器。

编辑:这是我设置VC的代码。

UIViewController *vc = [[UIViewController alloc] init];
    self.navigationController = [[UINavigationController alloc] initWithRootViewController:vc];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [self.window makeKeyAndVisible];
    [self.window addSubview:self.navigationController.view];

self.loadingWood = [[UIImageView alloc] init];
[vc.view addSubview:self.loadingWood];

然后不久:

self.timeline = [[JTimelineViewController alloc] init];
[self.navigationController setViewControllers:[NSArray arrayWithObject:self.timeline]];

这是应用启动时视觉效果所必需的。

编辑2:

我现在有这个工作。我现在面临的问题是,尽管我的一个viewControllers说明了这一点,它仍然会在iPhone模拟器上的任何旋转时旋转:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);

}

编辑3:我的手机正在运行iOS5。模拟器正在运行iOS6。这是一个可能的原因。删除横向左侧和横向右侧支持方向意味着根本没有模拟器旋转,但我的iOS5 iPhone 4继续正常旋转。

2 个答案:

答案 0 :(得分:1)

确保您正在设置根视图控制器,如:

    self.window.rootViewController = self.navigationController;

答案 1 :(得分:1)

过去我不得不处理类似的事情。结果是只有应用程序的主视图控制器接收轮换通知和委托调用。有一些例外,比如UINavigationController,将这些事件传递给它们当前的视图控制器。

因此,例如,如果您的AppDelegate类加载视图控制器并且该视图控制器推送第二个视图控制器,则该第二个视图控制器将不会收到旋转通知。

我建议您使用UINavigationController将UIViewControllers推送到显示器上,因为UINavigationController会传递旋转委托调用和通知。

修改

在Xcode的首选项中,在“下载”选项卡下,您可以选择下载以前的模拟器,iOS 5和iOS 5.1。下载这些并将目标iOS版本设置为5.0(或5.1),然后从设备列表中选择正确的模拟器。看看你是否遇到了与iOS 6模拟器相同的问题。如果你这样做,那么iOS 5和iOS 6处理UINavs的方式肯定存在差异。

此外,使用setViewControllerspushViewController之间的差异是pushViewController将视图控制器添加为父视图控制器的子级,这使得它响应委托调用,包括回转。从iOS 5开始,每个UIViewController现在都有一个名为addChildViewController的方法,可以为UIViewController类提供该功能。