iPhone View Controller横向/纵向旋转故障

时间:2014-01-20 18:17:05

标签: ios iphone objective-c uiview uiviewcontroller

我正在尝试为我的应用的不同子模式实施强制纵向/横向方向。为此,我有一个UINavigationController作为根控制器,每个子模式都有自己的视图控制器,它们是其中之一

@interface iosPortraitViewController : UIViewController

@interface iosLandscapeViewController : UIViewController

-(BOOL)shouldAutorotate;
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation;
-(NSUInteger) supportedInterfaceOrientations;

根据每个方向的方向类型重载并正确设置。例如iosLandscapeViewController :: supportedInterfaceOrientations返回UIInterfaceOrientationMaskLandscape。

当应用程序中的子模式发生变化时,相应的视图控制器将使用present / dismissViewController显示在根视图控制器上,这会强制方向重新评估并调用重载的视图控制器类中的函数并相应地定位自身

我的问题是,当我们切换到横向时,子模式视图的框架偏离屏幕的左上角应该是它的位置(它是显示背景图片的全屏视图)。

出于调试目的,如果我将该子模式的视图控制器更改为iosPortraitViewController,则视图信息为:

size = 480.000000 320.000000
bounds = 0.000000 0.000000 480.000000 320.000000
frame = 0.000000 0.000000 480.000000 320.000000
centre = 240.000000 160.000000
user interaction enabled = 1
hidden = 0
transform = 1.000000 0.000000 0.000000 1.000000 : 0.000000 0.000000

当处于横向模式时,视图信息为:

size = 480.000000 320.000000
bounds = 0.000000 0.000000 480.000000 320.000000
frame = 80.000000 -80.000000 320.000000 480.000000 
centre = 240.000000 160.000000
user interaction enabled = 1
hidden = 0
transform = 0.000000 -1.000000 1.000000 0.000000 : 0.000000 0.000000 

框架的80,-80原点是我遇到的问题 - 它应该是0,0。 (如果有人可以指出它是如何得到80,-80也会被欣赏 - 我可以看到X而不是Y)。

还要注意框架中的w和h是如何交换的,变换是旋转变换 - 从读取开始,我猜测UIWindow(总是处于纵向模式)已将此应用于视图变换根视图控制器?

我该怎么做才能解决这个问题?我需要视图控制器视图的框架在正确的位置(即原点为0,0)。我尝试过对它进行硬编码,但它似乎不起作用,反正它也不是一个很好的解决方案 - 我非常理解发生了什么,以及如何正确地解决它。

谢谢!

: - )

1 个答案:

答案 0 :(得分:1)

要支持备用横向界面,您必须执行以下操作:

  1. 实现两个视图控制器对象。一个用于呈现仅限纵向的界面,另一个用于呈现仅横向界面。
  2. 注册UIDeviceOrientationDidChangeNotification通知。在处理程序方法中,根据当前设备方向显示或关闭备用视图控制器。
  3. 从苹果指南到Creating an Alternate Landscape Interface

    同样来自指南:

    @implementation PortraitViewController
    - (void)awakeFromNib
    {
        isShowingLandscapeView = NO;
        [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                     selector:@selector(orientationChanged:)
                                     name:UIDeviceOrientationDidChangeNotification
                                     object:nil];
    }
    
    - (void)orientationChanged:(NSNotification *)notification
    {
        UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
        if (UIDeviceOrientationIsLandscape(deviceOrientation) &&
            !isShowingLandscapeView)
        {
            [self performSegueWithIdentifier:@"DisplayAlternateView" sender:self];
            isShowingLandscapeView = YES;
        }
        else if (UIDeviceOrientationIsPortrait(deviceOrientation) &&
                 isShowingLandscapeView)
        {
            [self dismissViewControllerAnimated:YES completion:nil];
            isShowingLandscapeView = NO;
        }
    }