iPhone(iOS 5)强制从横屏转为竖屏,然后再返回横屏

3

我正在为iOS 5开发应用程序,我有一个控制器需要以竖屏视图推送。从横向模式推送控制器相当棘手,但最终我找到了如何做到这一点的方法。我通过presentModalViewControllerpushViewController来显示控制器,在控制器内部我重写了preferredInterfaceOrientationForPresentation方法。

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}

它可以正常工作,但有一个问题。以下是情况:
  1. 用户将设备保持横屏模式并且当前控制器在横屏模式下正确显示。
  2. 用户执行某些操作,然后出现了仅限竖屏的控制器(作为模态控制器和以纵向模式)。
  3. 用户关闭模态控制器。
  4. 之前在横屏下工作的控制器现在变成了竖屏,但用户仍然保持设备处于横屏状态 ---> 这就是问题所在。
我尝试通过调用 [UIViewController attemptRotationToDeviceOrientation] 来修复它,但没有帮助。
提前感谢任何帮助。
2个回答

1
我希望您能得到一个更好、更有效的解决方案,而不像我一样做了一些麻烦的事情才能让它工作。我的问题是我需要支持从4.3到6.0版本。一些pushModal函数发生了重大变化,已经过时等等,还有旋转方面的变化。
我编写了一个RoatatingViewController并将其添加到根视图中。然后我添加了所需的push modals和pushviewconcollers。当我需要pop时,我会进行检查:如果堆栈上的所需组件处于所需方向,则很好,无需更改。否则:弹出横屏并推入纵向实例,并将横屏数据复制到纵向。
这不是很好,也不是很内存高效,但在所有iOS版本中都可以正常工作而不崩溃。祝你好运!

谢谢你的回答,我尝试了你的解决方案,但对我没有用,可能是我理解有误。你能否请解释一下何时弹出横屏控制器并推入竖屏控制器? - Michal
我所做的是,在模态控制器的viewWillDisappear方法中弹出横屏显示的控制器,然后再将其推入栈中。这样做是正确的吗?还是我的想法有误? - Michal
@Michal,这不仅仅是两行代码...还有几个类。还需要注册通知以获取设备方向更改通知,并且它也取决于操作系统版本。很抱歉看到它对你没有帮助! - user529543

1
您说正在使用IOS 5,但是preferredInterfaceOrientationForPresentation()方法仅从IOS 6开始可用。
为了解决您的问题(在ios5中),您需要重写shouldAutorotateToInterfaceOrientation()方法,如下所示...
在目标视图控制器(需要在纵向模式下显示的视图控制器)中,如下所示...
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return UIInterfaceOrientationIsPortrait(interfaceOrientation);
}

更新:

在当前的视图控制器(需要横屏模式的视图控制器)中,像这样....

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

谢谢你的回答,Bhanu。我已经看过这个好几次了,但它从来没有帮助我强制控制器在不同的界面方向中... - Michal
已更新答案,请检查。@Michal - Bhanu Prakash

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