假设我在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。
答案 0 :(得分:3)
UIViewController有几种方法可以实现,为您处理方向变化的生命周期:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
等
如果您使用的是简单的UIViewControllers,最好使用这些方法而不是注册事件。
此外,如果您需要检查设备方向是横向还是纵向,则最好使用它:
UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation];
if (UIInterfaceOrientationIsLandscape(currentOrientation))
{
...
}