1

因此,我试图通过执行以下操作来强制更改部分代码的设备方向:

if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait ||
        [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown){
        [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO];
    }

但是方向没有改变。为什么是这样?基本上当前方向是纵向的,我希望它被迫处于横向

4

4 回答 4

5

如果 Inder Kumar Rathore 的建议有效,那就太好了。但是文档将方向属性描述为只读的,所以如果它有效,我不确定你是否可以依赖它在未来工作(除非 Apple 做了聪明的事情并改变了这一点;强制改变方向,不管如何用户当前正在拿着他们的设备,这是一个明显的功能需求)。

作为替代方案,在 viewDidLoad 中插入的以下代码将成功(并且有点奇怪地)强制定向(假设您已经按照 roronoa zorro 推荐的方式修改了 shouldAutorotateToInterfaceOrientation):

if (UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]))
{
    UIWindow *window = [[UIApplication sharedApplication] keyWindow];
    UIView *view = [window.subviews objectAtIndex:0];
    [view removeFromSuperview];
    [window addSubview:view];
}

显然,如果用户当前以纵向模式持有他们的设备(因此推测您的 shouldAutorotateToInterfaceOrientation 仅设置为横向,并且如果用户以纵向模式持有他们的设备,则此例程将其转换为横向)。如果您的 shouldAutorotateToInterfaceOirentation 仅设置为纵向,您只需将 UIDeviceOrientationIsPortrait 与 UIDeviceOrientationIsLandscape 交换。

出于某种原因,从主窗口中删除视图然后重新添加它会强制它查询 shouldAutorotateToInterfaceOrientation 并正确设置方向。鉴于这不是 Apple 认可的方法,也许人们应该避免使用它,但它对我有用。你的旅费可能会改变。但是这个SO 讨论也涉及其他技术。

于 2012-05-20T06:28:45.407 回答
4

在 iOS7 上完美运行

如果你想要 Potrait 那么:

[[UIDevice currentDevice] setValue:
                      [NSNumber numberWithInteger: UIInterfaceOrientationPortrait]
                            forKey:@"orientation"];

如果你想要风景:

[[UIDevice currentDevice] setValue:
                      [NSNumber numberWithInteger: UIInterfaceOrientationLandscapeRight]
                            forKey:@"orientation"];
于 2014-08-27T12:25:00.287 回答
2

如果设备处于横向,则无法强制设备进入纵向模式,反之亦然。您所能做的就是告诉您的应用程序处于特定模式,无论是横向还是纵向。您可以通过以下方式做到这一点:-

  1. 您应该实施shouldAutorotateToInterfaceOrientation

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    { 
        // Return YES for supported orientations
        return UIInterfaceOrientationIsLandscape(interfaceOrientation);
    }
    
  2. 编辑 pList。

    根据您的需要,UIInterfaceOrientation在您的 plist 中添加一个键并将其属性更改为UIInterfaceOrientationLandscapeLeft, ..UIInterfaceOrientationLandscapeRightUIInterfaceOrientationPortraitUpsideDown

于 2012-05-20T05:14:11.803 回答
1

编辑

这在 iOS 7 中可能不起作用,但它在以前的 iOS 版本中起作用,所以现在对这个答案投反对票是没有意义的。这个问题是在 2 年前提出的,我当时回答了这个问题,当时这是一个可行的解决方案。


[[UIDevice currentDevice] setOrientation: UIDeviceOrientationLandscapeLeft];
于 2012-05-20T05:13:55.217 回答