以编程方式将设备方向更改为横向不起作用

时间:2012-05-20 04:43:50

标签: iphone objective-c ios ipad

所以我想通过执行以下操作来强行更改代码的一部分设备方向:

if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait ||
        [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown){
        [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO];
    }
然而,方向没有改变。为什么是这样?基本上目前的方向是肖像,我希望它被迫在风景中

4 个答案:

答案 0 :(得分:5)

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

作为替代方案,在viewDidLoad中插入的以下代码将成功(并且有点奇怪)强制方向(假设您已经修改过,您应该将rutoronate zorro推荐为:AutorotateToInterfaceOrientation):

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 discussion也指其他技术。

答案 1 :(得分:4)

在iOS7上完美运作

如果你想要Potrait那么:

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

如果你想要风景:

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

答案 2 :(得分:2)

如果它处于横向状态,你就无法强制你的设备进入纵向模式,反之亦然。你所能做的就是告诉你的应用程序处于横向或纵向的特定模式。你可以通过以下方式实现: - < / p>

  1. 您应该实施shouldAutorotateToInterfaceOrientation

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

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

答案 3 :(得分:1)

修改

这可能不适用于iOS 7,但它在以前的iOS版本中有效,所以现在对这个答案的贬低是没有意义的。问题是在2年前被问到的,当时我回答了这个问题,然后这是一个有效的解决方案。


[[UIDevice currentDevice] setOrientation: UIDeviceOrientationLandscapeLeft];