通用应用程序中的IOS 6方向问题

时间:2013-01-04 06:11:31

标签: iphone ipad ios5 ios6 uiinterfaceorientation

在我的通用应用程序中,我需要处理iphone和ipad的不同方向。对于ipad,我需要允许横向和iphone肖像。我在第一时间返回了以下代码

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
        return UIInterfaceOrientationIsPortrait(interfaceOrientation);

    return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}

在IOS 5中工作正常但在IOS 6中,autorotate方法根本没有被解雇。之后我将方法改为,

-(BOOL)shouldAutorotate
{
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationMaskPortrait;
}

即使这种方法在IOS 6中也没有被解雇。

我的plist设置是

enter image description here

我需要同时处理IOS 5和IOS 6的方向[iPhone-portrait,iPad-landscape]。请指导我解决此问题。

4 个答案:

答案 0 :(得分:3)

你的rootviewcontroller是UINavigation控制器还是UITabbarcontroller? 如果是这样,如果您在视图控制器中调用这些方法,这些方法将无法工作。

因此,在这些容器视图控制器上创建一个目标C类别,并添加到您的项目中。

@implementation UINavigationController (autorotate)


 -(NSUInteger)supportedInterfaceOrientations
 {
   //make the check for iphone/ipad here

if(IPHONE)
    {
return UIInterfaceOrientationMaskPortrait;
    } 
else
    {
return UIInterfaceOrientationMaskLandscape;
    }

 }

 - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
 {
return UIInterfaceOrientationPortrait;
 }

 - (BOOL)shouldAutorotate
 {
return NO;
 }

答案 1 :(得分:2)

将此方法添加到您的应用委托其100%正常工作

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window  // iOS 6 autorotation fix
{
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        return UIInterfaceOrientationPortraitUpsideDown;
    }
    else
        return  UIInterfaceOrientationMaskAll;
}

答案 2 :(得分:0)

您想要的是以下内容:

#pragma mark - iOS 5.1 and under Rotation Methods

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation; {
  if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
    return UIInterfaceOrientationIsPortrait(interfaceOrientation);
  }
  else{
    return UIInterfaceOrientationIsLandscape(interfaceOrientation);
  }
}

#pragma mark - iOS 6.0 and up Rotation Methods

- (BOOL)shouldAutorotate; {
  return YES;
}

- (NSUInteger)supportedInterfaceOrientations; {
  if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
    return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown);
  }
  else{
    return UIInterfaceOrientationMaskLandscape;
  }
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation; {
  if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
    return UIInterfaceOrientationPortrait;
  }
  else{
    return UIInterfaceOrientationLandscapeLeft;
  }
}

您必须确保 2倍

首先,这是在RootViewController中实现的。如果您将UIViewController嵌入UINavigationController(或UITabBarController),则必须自定义UINavigationController(或自定义UITabBarController)实现这些方法并使用它的类。

第二次,您必须确保Info.plist文件中支持方向。否则,系统将覆盖这些方法的返回值(注意:,您也可以通过单击目标摘要页面中的按钮轻松更改这些值。)

希望有帮助!

答案 3 :(得分:0)

这是Pradeep答案的快速版本。您不需要将所有导航控制器子类化以获得您想要的工作(也就是说,仅关闭iPhone的横向方向)

只需将此添加到您的应用代理:

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int {
    if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
        return Int(UIInterfaceOrientationMask.Portrait.rawValue)
    } else {
        return Int(UIInterfaceOrientationMask.All.rawValue)
    }
}