如何正确切换到Landscape View?

时间:2012-03-07 10:58:20

标签: objective-c ios nsnotificationcenter landscape-portrait

我有一些带有一些单词的表视图,当设备旋转时,我会呈现闪存卡风格的横向视图。我通过观察“UIDeviceOrientationDidChangeNotification”来实现它。

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(openLandscapeMode) name:@"UIDeviceOrientationDidChangeNotification" object:nil];

1)工作得很好,但问题是,当我们在景观中时,我不希望视图控制器对绕垂直轴旋转作出反应,这样我就可以将手机放在桌子,它仍然在风景中。 也许我应该以某种方式观察水平旋转,而不是设备方向?

-(void)openLandscapeMode
{

    if([[UIDevice currentDevice]orientation]==UIDeviceOrientationLandscapeLeft||[[UIDevice currentDevice]orientation]==UIDeviceOrientationLandscapeRight)
    {
        LandscapeCardViewController *landscape = [[LandscapeCardViewController alloc]init];
        landscape.words = words;
        landscape.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        [self presentModalViewController:landscape animated:YES];
        NSLog(@"Switch to %@",[[NSUserDefaults standardUserDefaults]valueForKey:@"ChosenWordInCard"]);
        [landscape release];
    }
    else
    {
        [self dismissModalViewControllerAnimated:YES];  
        [[UIApplication sharedApplication]setStatusBarOrientation:UIInterfaceOrientationPortrait];

    }
}

2)第二个问题是删除观察者的位置,如果此控制器位于标签栏中,并且我想在同一个标​​签栏中的另一个控制器中执行相同的过渡,当然,还有另一个横向视图? 我试过viewWillDissappear,但它无法正常工作。 非常感谢!

2 个答案:

答案 0 :(得分:2)

对于您的第一个问题,您的viewcontroller中应该有一个方法,您可能需要编辑该方法以仅支持肖像

-(BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation {
return UIInterfaceOrientationPortrait(interfaceOrientation); //only allow portrait
}

这将阻止它自动旋转到横向,同时保持原始方法的完整

第二个。过渡完成后怎么办?然后在视图再次出现时重新添加它。然后在您的横向控制器中,添加它以重新检测设备是否为纵向。

答案 1 :(得分:0)

我找到了解决方案 我改成了if([[UIDevice currentDevice]orientation]==UIDeviceOrientationPortrait||[[UIDevice currentDevice]orientation]==UIDeviceOrientationPortraitUpsideDown),一切正常! 很奇怪,但它确实有效!

关于移除观察者 - 我在-viewWillAppear中执行此操作,检查,如果我现在不在风景中。