框架不改变,而在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在导航控制器中的控制器而言是正确工作的,但对于单个控制器或模式控制器来说则不是。 对于这些情况,从边界切换到帧,解决了这个问题。