1

当我的 UI 流程如下时,我的应用程序中有一个奇怪的错误:

  1. mainViewController 以纵向启动,然后显示一个 LoginViewController,其中 modalPresentationStyle 设置为UIModalPresentationFullScreen

  2. 我将 loginViewController 设置为横向模式,输入凭据进行登录(验证用户的方法在 mainViewController 中定义)。

  3. loginViewController 被解除(从 mainViewController)并且一堆按钮被加载到屏幕上以指示它是主屏幕。

现在我的问题是按钮位置看起来好像应用程序处于纵向方向,即使在显示 loginViewController 时应用程序切换到横向。

此外,仅当 modalPresentationStyle 设置为UIModalPresentationFullScreen! 当我将其呈现为表单或页面表时,一切正常(但是,我需要将 loginViewController 显示为全屏)。

到目前为止,我已经尝试在 loginViewController 被解除等时手动调用 shouldAutorotate 方法,这解决了问题,但似乎是一种劣质的解决方法而不是修复。

我也尝试从 loginViewController 调用 mainViewController 的 shouldAutorotate 方法,但这并没有改变。

关于如何解决这个问题的任何想法?

4

2 回答 2

1

自动旋转在 iOS 6 中发生了变化。在 iOS 6 中,shouldAutorotateToInterfaceOrientation:UIViewController 的方法已被弃用。取而代之的是,您应该使用supportedInterfaceOrientations:andshouldAutorotate方法:

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAllButUpsideDown;    
}

模态视图控制器在 iOS 6 中不再获得旋转调用:willRotateToInterfaceOrientation:duration:, willAnimateRotationToInterfaceOrientation:duration:didRotateFromInterfaceOrientation:方法不再在任何对其自身进行全屏演示的视图控制器上调用——例如那些被调用的视图控制器:presentViewController:animated:completion:

这个答案将进一步解释 iOS 6 中的旋转变化


[编辑] 完全不同的方式是注册轮换事件。优点是所有对象都可以为此注册,而不仅仅是UIViewController. 这通常在视图加载时完成,并在视图消失时停止(在此处放入 dealloc)。当方向改变时调用选择器中的方法(这里是orientationChanged:):

- (void)viewDidLoad {
    [super viewDidLoad];
    // Start generating device rotations and register for them
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
}

- (void)dealloc {
    // Deregister and stop generating device rotations
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
    [super dealloc];
}
于 2012-12-10T18:16:15.833 回答
0
check this out.... may be this'll help...


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
     return (interfaceOrientation == UIInterfaceOrientationPortrait |interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown| interfaceOrientation == UIInterfaceOrientationLandscapeLeft | interfaceOrientation == UIInterfaceOrientationLandscapeRight);

}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationPortrait | UIInterfaceOrientationPortraitUpsideDown | UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight;
}

- (BOOL) shouldAutorotate
{
    return YES;
}
于 2012-12-14T04:52:35.670 回答