iPad:如何根据方向(横向/纵向)显示不同的屏幕

Posted

技术标签:

【中文标题】iPad:如何根据方向(横向/纵向)显示不同的屏幕【英文标题】:iPad: How to display a different screen depending on orientation (landscape / portrait) 【发布时间】:2011-07-11 18:29:52 【问题描述】:

我有一个 iPad 应用程序,可以在所有四种视图模式(纵向上/下和横向左/右)下使用。但在某个时刻,我有一个视图,我只想在 landscape 模式下看到。所以我在 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 向用户显示他/她应该正确旋转设备的消息查看屏幕。

因此,当用户随后将他/她的设备旋转到横向模式时,我想向他们展示正确的视图 (PropertyViewController)。所有这些都有效!

问题出现在这个 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 度。所以基本上它以 portrait 模式显示内容,而不是使用 landscape 模式(这实际上是您拿着设备的方式)..

我希望这是有道理的,有人可以告诉我是什么原因造成的。

截图更清楚:

When device is held in portrait mode After rotating the device

【问题讨论】:

【参考方案1】:

此时

- (BOOL)shouldAutorotateToInterfaceOrientation:UIInterfaceOrientation)interfaceOrientation

你告诉视图控制器你支持什么方向。设备实际上还没有旋转,因此视图控制器intefaceOrientation 属性仍然是portrait,所以当它被推入堆栈时,它认为设备是portrait

pseudo code
shouldAutoRotate... // at this point self.interfaceOrientation == portrait
                    // you push your controller here so it loads when the property is 

我不确定这是否能正常工作,但我能看到的最早可以推送的是

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation

【讨论】:

interfaceOrientation(因此 self.interfaceOrientation)是一个只读变量,因此不起作用。使用 didRotateFromInterfaceOrientation 方法确实有效。我不知道这个事件。谢谢! 我知道这是一个只读属性,但我认为这是视图控制器内部使用的属性,因此了解何时设置它很重要,这样您就可以选择最佳时间来推动控制器。 willrotateto ... 状态如果你想改变位置 / x 和 y 而不出现烦人的跳跃,会有很大帮助

以上是关于iPad:如何根据方向(横向/纵向)显示不同的屏幕的主要内容,如果未能解决你的问题,请参考以下文章

ipad:横向和纵向方向的问题

iPad - 根据设备方向(纵向或横向)更改图像

支持iPhone 6和iPhone 6+,具有不同的启动/启动屏幕图像,适用于iPad纵向和横向方向

iPad 横向显示纵向框架和边界

iPad Pro 中的横向方向

在 iOS 14 中锁定屏幕方向