方向问题 - ipad

时间:2012-07-24 20:37:36

标签: iphone objective-c ios xcode ipad

我的应用程序有几个uiViews并设置为支持两种方向。因为我的uiViews框架只是iPad整体尺寸的一部分,所以我试图将我的uiviews框架放在中心位置,这取决于iPad的定位方式。在视图controller.m文件中以这种方式完成:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    UIInterfaceOrientation des=self.interfaceOrientation;

    if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad) //iPad
    {
        CGRect ScreenBounds  = [[UIScreen mainScreen] bounds];

        if(des==UIInterfaceOrientationPortrait||des==UIInterfaceOrientationPortraitUpsideDown)//ipad-portrait
        {

            ipStPosX=(ScreenBounds.size.width -360)/2;
            ipStPosY=100; 
            return YES;
        }
        else//ipad -landscape
        {
            ipStPosX=(ScreenBounds.size.height -360)/2;
            ipStPosY=100; 
            return YES;
        }
    }
    else//iphone
    {
        UIInterfaceOrientation des=self.interfaceOrientation;

        if(des==UIInterfaceOrientationPortrait||des==UIInterfaceOrientationPortraitUpsideDown) //iphone portrait
        {
            return NO;
        }
        else //iphone -landscape
        {
            return YES;
        }
    }
}

启动应用程序并更改方向后,无论我如何握住设备,它都将始终转到纵向部分UIInterfaceOrientationPortrait。

我看到一些不太适合这个问题的旧帖子,并且令人困惑或过时,所以这里的任何帮助都会很棒。

2 个答案:

答案 0 :(得分:1)

shouldAutorotateToInterfaceOrientation:仅用于告诉iOS您支持特定的方向。既然你想要除了iPhone之外的所有东西,你应该返回

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) //iPad
        return YES;
    return UIInterfaceOrientationIsPortrait(orientation);
}

要实际调整您显示的内容,您希望使用willRotateToInterfaceOrientation:duration:didRotateFromInterfaceOrientation:来实际更改项目。在你的情况下,鉴于你只是根据你所处的方向调整一些iVars,我认为你将使用后者。

- (void)didRotateToInterfaceOrientation:(UIInterfaceOrientation)fromOrientation
    UIInterfaceOrientation des = self.interfaceOrientation;
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) //iPad
    {
        CGRect ScreenBounds  = [[UIScreen mainScreen] bounds];

        if (UIInterfaceOrientationIsPortrait(des))//ipad-portrait
        {
            ipStPosX=(ScreenBounds.size.width -360)/2;
            ipStPosY=100; 
        }
        else //ipad -landscape
        {
            ipStPosX=(ScreenBounds.size.height -360)/2;
            ipStPosY=100; 
        }
    }
}

答案 1 :(得分:0)

我认为这里存在两个问题:

  1. 启用旋转 - 可以通过实施以下方法来完成。您应该在此方法中放置一个断点以确保其被调用并返回YES。请注意,此方法仅针对那些推送到导航栏或标签栏或属于窗口一部分的视图调用。对于使用addSubView方法添加到其他视图的视图,不会调用此方法。

    • (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)取向;
  2. 实现上述方法而不实施任何其他方法将轮换您的视图。如果没有,您需要调查我上面概述的要点。一旦您的视图开始旋转,您需要使用自动调整遮罩来实现您计划要执行的操作。使用自动调整遮罩可以轻松实现视图居中。如果使用XIB,您可以在xcode中查看调整大小行为。