框架不改变,而在iPad的方向

在我的根视图控制器的viewDidLoad,我添加了一个观察者的方向检测:

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

添加了如下方法:

 - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { NSLog(@"%f,%f",self.view.frame.size.width,self.view.frame.size.height); } 

我期待的结果是768,1004的肖像和1004,768的景观。 但是我的结果是768,1004。 有时候这个人像是748,1024。 我不知道为什么这个奇怪的行为。 如果你知道解决scheme,请帮助我。

编辑这相同的代码在我的另一个项目中工作,我找不到他们之间的任何区别

添加这两个方法:

 - (BOOL)shouldAutorotate { return TRUE; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskAll; } 

并在这里做所有修改:

 - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation duration:(NSTimeInterval)duration { NSLog(@"%f,%f",self.view.frame.size.width,self.view.frame.size.height); } 

[如果你看看苹果的文档willRotateToInterfaceOrientation ,它说:]

在用户界面开始旋转之前发送到视图控制器。

这意味着框架的宽度和高度应该是旋转的方向。

也许如果你在旋转完成之后尝试获取框架坐标,比如说,在didRotateFromInterfaceOrientation期间,你可能会看到更像你希望完成的事情。

首先,您不需要为该通知添加观察者,视图控制器默认发送此通知。 所以,删除前两行,它应该正常工作。 因为这是“意志”的方法,正确的意思是在旋转之前得到视图的大小。

然而,方法,willAnimateRotationToInterfaceOrientation:duration:,如果这是你想要的(即使它是一个“will”方法),旋转后的视图的维度。

编辑后

出于某种原因,这些方法对于embedded在导航控制器中的控制器而言是正确工作的,但对于单个控制器或模式控制器来说则不是。 对于这些情况,从边界切换到帧,解决了这个问题。