5

在我的通用应用程序中,我需要为 iphone 和 ipad 处理不同的方向。对于 ipad,我需要允许横向和单独的 iphone 纵向。我首先返回了以下代码

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

    return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}

在 IOS 5 中运行良好但在 IOS 6 中自动旋转方法根本没有被触发。之后,我将方法更改为,

-(BOOL)shouldAutorotate
{
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationMaskPortrait;
}

甚至这种方法在 IOS 6 中也根本没有触发。

我的 plist 设置是

在此处输入图像描述

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

4

4 回答 4

3

您的 rootviewcontroller 是 UINavigation 控制器还是 UITabbar 控制器?如果是这样,如果您在视图控制器中调用这些方法,这些方法将不起作用。

因此,在这些容器视图控制器上创建一个目标 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;
 }
于 2013-01-04T06:48:33.667 回答
2

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

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window  // iOS 6 autorotation fix
{
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        return UIInterfaceOrientationPortraitUpsideDown;
    }
    else
        return  UIInterfaceOrientationMaskAll;
}
于 2013-06-19T07:30:05.073 回答
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-fold

首先,这是在你身上实现的RootViewController。如果您将UIViewController' 嵌入到 a UINavigationController(或 a UITabBarController)中,那么您必须创建一个自定义UINavigationController(或自定义UITabBarController)类来实现这些方法并使用它。

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

希望有帮助!

于 2013-01-04T06:42:11.577 回答
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)
    }
}
于 2015-03-02T21:42:26.943 回答