具有多个视图的iPad应用程序,如何仅在横向上显示一个单一视图?

时间:2011-07-11 13:09:45

标签: objective-c xcode ipad orientation landscape

在获得miamk的支持回答之后,我向实现我想要的东西迈进了一步..但现在有以下问题:

我有一个iPad应用程序,可用于所有四种视图模式(纵向上/下和横向左/右)。但在某个时刻,我有一个我只希望在风景模式中看到的视图。所以我在UIViewController中执行以下操作,触发操作以查看仅横向视图:

- (void) showProperty:(Property *) property {
    if ([self interfaceOrientation] == UIInterfaceOrientationLandscapeLeft || [self interfaceOrientation] == UIInterfaceOrientationLandscapeRight) {
        PropertyViewController *propertyView = [[PropertyViewController alloc] initWithNibName:@"PropertyViewController" bundle:[NSBundle mainBundle]];
        propertyView.property     = property;
        [self.navigationController pushViewController:propertyView animated:YES];
        [propertyView release];
        propertyView = nil;
    }
    else {
        RotateDeviceViewController *rotateView = [[RotateDeviceViewController alloc] initWithNibName:@"TabRotate" bundle: [NSBundle mainBundle]];
        rotateView.property = property;
        [self.navigationController pushViewController:rotateView animated:YES];
        [rotateView release];
        rotateView = nil;
    }
}

这很好用,因此当iPad以横向模式保持时显示所需的屏幕(PropertyViewController),如果没有,则显示RotateDeviceViewController,向用户显示他/她应该正确旋转设备的消息查看屏幕。

这样有效!

然后问题出现在 RotateDeviceViewController ..我有以下内容:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if (UIInterfaceOrientationIsLandscape(interfaceOrientation))
        [self showProperty];
    return UIInterfaceOrientationIsPortrait(interfaceOrientation);
}

- (void) showProperty {
    PropertyViewController *propertyView = [[PropertyViewController alloc] initWithNibName:@"PropertyViewController" bundle:[NSBundle mainBundle]];
    propertyView.property     = property;
    [self.navigationController pushViewController:propertyView animated:YES];
    [propertyView release];
}

因此,只要我将设备(查看 RotateDeviceViewController )旋转到横向模式,我就会向用户显示 PropertyViewController 。这有效...但是当 PropertyViewController 出现时,它显示我的布局旋转了90度。所以基本上它以纵向模式显示内容,而不是使用横向模式(这实际上是您持有设备的方式)..

我希望这是有道理的,有人可以告诉我是什么导致了这一点。

3 个答案:

答案 0 :(得分:1)

@ MacN00b的答案更优雅的解决方法(至少在设计方面)是设置一个纵向视图,其中包含一条消息,告诉用户他应该旋转设备,只有当他旋转它时才显示视图为景观而建。

老实说,当用户仍处于纵向方向时,我认为所有内容都已经旋转,这很难看。

答案 1 :(得分:1)

您可以使用以下方式收听方向更改:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];

然后通过加载适当的视图来回应那些......

- (void) orientationChanged:(id)object
{
    UIInterfaceOrientation interfaceOrientation = [[object object] orientation];

    if (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
    {
        self.view = self.portraitView;
    }
    if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight)
    {
        self.view = self.landscapeView;
    }
}

如果这是针对相关屏幕的专用UIView子类,您可以使portraitView包含一个标签,通知用户旋转屏幕以查看内容,然后使横向视图包含您的实际内容。

我目前在应用中执行此操作,并且两个视图都包含在一个笔尖中。请确保为每个视图在IB中的视图属性上设置方向...

答案 2 :(得分:-1)

试试这个:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

希望这有帮助。