如何创建一个同时支持横向和纵向但不在它们之间旋转的视图控制器(保持其初始方向)

Posted

技术标签:

【中文标题】如何创建一个同时支持横向和纵向但不在它们之间旋转的视图控制器(保持其初始方向)【英文标题】:How to create a view controller that supports both landscape and portrait, but does not rotate between them (keeps its initial orientation) 【发布时间】:2011-01-05 01:45:45 【问题描述】:

我想创建一个支持横向和纵向方向的视图控制器,但 不能 在它们之间旋转 - 也就是说,视图应该保持其原始方向。

我尝试创建一个 ivar initialOrientation 并将其设置在 -viewDidAppear

initialOrientation = self.interfaceOrientation;

然后

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    return (interfaceOrientation == initialOrientation);

但这会导致令人困惑的问题(可能是因为-shouldAutorotateToInterfaceOrientation-viewDidAppear 之前被调用)。

如何将方向锁定为其原始方向?

【问题讨论】:

【参考方案1】:

我猜我是在正确的轨道上。我通过将initialOrientation 设为属性解决了这个问题,然后从调用 viewController 进行设置:

OrientationLockedViewController *vc = [[OrientationLockedViewController alloc] init];
vc.initialOrientation = self.interfaceOrientation;

现在我有,OrientationLockedViewController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
return (interfaceOrientation == self.initialOrientation);

【讨论】:

【参考方案2】:

这是一个奇怪的要求,我认为 UIKit 不是为了处理而设计的。我认为 UIKit 何时调用 -shouldAutorotateToInterfaceOrientation 或缓存这些结果的时间没有记录,所以如果这种行为很重要,我会看到两种可能性。

    尽早设置initialOrientiation,当您初始化视图控制器时(如果不是更早),这样您的-shouldAutorotateToInterfaceOrientation 行为永远不会改变,但应用程序会尊重它开始时的方向。

    在显示此控制器的视图之前检测设备方向并自行应用视图的旋转变换。根据您的视图控制器层次结构,您可能需要宣传对所有旋转的支持以允许设备旋转,然后在您的视图上设置一个变换以始终旋转到相同的方向,而不管设备的方向如何。

【讨论】:

看起来我很慢,你选择了选项 #1。只要您不需要此控制器实例能够在其不可见时切换其initialOrientation,那么这应该有望为您可靠地工作。 好点。将属性命名为 initialOrientation 应该清楚地表明不支持更改此值(即使视图不在屏幕上)。

以上是关于如何创建一个同时支持横向和纵向但不在它们之间旋转的视图控制器(保持其初始方向)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 phonegap 构建同时支持纵向和横向启动屏幕?

从纵向模式旋转到横向模式时不调整子视图

旋转放置和移动视图 (UIView)

如何查找PDF是横向还是纵向

如何将视图从纵向模式旋转到横向模式

monotouch 在横向模式和纵向模式下旋转