停止调用beginGeneratingDeviceOrientationNotifications生成的方法

时间:2011-09-06 19:32:27

标签: objective-c ipad

假设我在nib文件someNib​​.xib中。为了让我能够判断设备方向是否发生了变化,我将其置于视图内部的加载方法:

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

这一行的作用是它超时调用deviceOrientationChanged方法旋转设备。我的deviceOrientationChanged方法如下:

-(void) deviceOrientationChanged{

    if(self.view.frame.size.width<800)
    { 
      //means device is on portrait mode
    } else {

       //means device is on landscape mode
    }


}

所以这个nib文件的一切都很好用。当我将另一个nib文件加载为:

时,问题就出现了
            // release allocated variables
            // VCHome is the name of the nib file
            VCHome *control = [VCHome alloc];
            [control initWithNibName:@"VCHome" bundle:nil];
            UINavigationController *navControl = [[UINavigationController alloc] initWithRootViewController:control];
            [self presentModalViewController:navControl animated:YES];
            [navControl setNavigationBarHidden:YES];
            [control release];
            [navControl release];
直到这一刻,一切都很好。我现在正在使用新的nib文件,我可以与VCHome进行交互。

为什么当我使用VCHome nib文件并旋转设备时,会调用deviceOrientationChanged方法?当我加载VCHome nib文件时,我应该释放someNib​​(最后一个nib),以便不会调用此方法。我不打算再使用someNib​​了,并希望我的VCHome笔尖表现得像我从未加载过someNib​​。

1 个答案:

答案 0 :(得分:3)

UIViewController有几种方法可以实现,为您处理方向变化的生命周期:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

如果您使用的是简单的UIViewControllers,最好使用这些方法而不是注册事件。

此外,如果您需要检查设备方向是横向还是纵向,则最好使用它:

UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation];
if (UIInterfaceOrientationIsLandscape(currentOrientation))
{
   ...
}