只支持竖屏的iPhone应用程序,具有多个nib文件。

8
我正在开发一款iPhone应用程序,其中有几个nib文件,并且应该仅支持横屏模式。
该应用程序通过其Info.plist文件设置为以横屏模式启动。
我有两个视图控制器:FirstViewController和SecondViewController。
对于每个视图控制器,我都有一个nib文件,其中视图是横向的。这两个视图控制器都添加到我的MainView nib中作为输出口,它们的视图是惰性初始化的。
当应用程序加载时,第一个视图按预期以横向显示。但是,当我切换到第二个视图时,设备(或模拟器)仍处于横向状态,但视图被旋转,就好像设备处于纵向模式下,破坏了我的界面。
在两个UIViewController类中,我都有以下代码:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return interfaceOrientation == UIInterfaceOrientationLandscapeRight;
}

要切换视图,在我的应用程序委托中,我正在执行以下操作:

[viewController.view removeFromSuperview];
[window addSubview:secondViewController.view];

其中viewControllersecondViewController是两个输出口,用于连接视图控制器。

这是第二个视图在IB中的样子: alt text http://img27.imageshack.us/img27/4898/picture1ni.png

这是它在模拟器中的样子: alt text http://img402.imageshack.us/img402/4866/picture2wt.png

为什么第二个视图以横向显示但界面却旋转了呢?

我不想处理变换属性,因为那似乎太过复杂。

2个回答

3

我收藏了这个问题,希望有人能给你一个深刻的回答,这样我也能学到一些东西。但遗憾的是,我担心你可能需要使用转换才能使其正常工作。以下是我最近用来解决问题的代码:

- (void)forceLandscapeForView:(UIView *)theView {
  theView.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
  theView.bounds = CGRectMake(0, 0, 480, 320);
  theView.center = CGPointMake(160, 240);
  [theView setNeedsLayout];
  [theView setNeedsDisplay];
}

在添加新视图时,检查当前的方向,如果必要,强制旋转:

if (!UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) {
  [self forceLandscapeForView:_activeViewController.view];
}

当然,您需要在每个视图控制器中适当地响应shouldAutorotateToInterfaceOrientation

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

如果这些操作不是必要的,我很想听听其他解决方案。但我注意到了一个问题:如果您在视图之间进行转换并在此过程中旋转手机,则可能会发生视图方向翻转或“卡住”的情况,导致在导航视图之间需要将手机翻转(横屏向右与横屏向左)。


到目前为止,这被证明是实现我想要的最可靠的方法。 - pgb
这个(第一个方法)对我有用。我已经寻找解决方案几个小时了,之前尝试过类似的东西(但是在视图didLoad中...)。在将其添加为子视图之前应用上述转换。 - Wollan

0

这只是一个建议,但你可以尝试在第二个视图的shouldAutorotate方法中返回NO。或者在IB中将其设置为纵向视图。似乎你的视图已经正确加载(横向模式),但随后接收到shouldAutorotate消息并旋转了90度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接