在iPhone重新定向后,“错误的”框架/窗口大小

在我的iPhone OS应用程序中,我想(需要)监视设备方向的变化,以重新排列屏幕的某些部分。 我使用的方法是使用CGRect frame = [UIScreen mainScreen].applicationFrame来获取屏幕大小,并从那里计算其他控件的大小和/或定位(我也试过self.view.frame )。

所有的testing都是在肖像模式下完成的,所以我可以专注于编程主要function,之后只需对Landscape进行一些调整。 而在这里进入问题:在-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation我添加了一些日志来检查大小继续之前,但显然宽度和高度的值是“错误的”(我说“错”,因为在第一一瞥价值对我来说没有意义)。

以下是一些日志logging的输出:

  • 旋转:风景[w = 300.000000,h = 480.000000]
  • 旋转:纵向[w = 320.000000,h = 460.000000]

“风景”中的“w”和“h”的值似乎与我相反 – 我期待w = 480和h = 300。

我究竟做错了什么? 我用来debugging的代码如下。

 -(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { CGRect frame = [UIScreen mainScreen].applicationFrame; CGSize size = frame.size; NSLog(@"%@", [NSString stringWithFormat:@"Rotation: %s [w=%f, h=%f]", UIInterfaceOrientationIsPortrait(self.interfaceOrientation) ? "Portrait" : "Landscape", size.width, size.height]); } 

您的设备的方向已更改,而不是屏幕的物理特征。 你基本上把它放在一边,但实际上它是320像素宽(其中20个是目前不能提供给你的,因为状态栏显示)和480像素高。 如果您的视图是自动旋转的,那么宽度/高度已经被翻译好了,但是当您询问屏幕的实际尺寸时,您将返回屏幕的实际尺寸。

这也是为什么在处理翻译视图时,根据视图的中心和视图边界进行计算,而不是在视图的框架上进行计算是非常重要的。

改用self.view.bounds

我一直在同样的问题和一些诊断工作,我发现视图的边界和框架不能准确地反映viewDidLoad (当视图控制器被推入堆栈时横向举行的设备)横向方向,但在viewWillAppear:viewDidAppear:正确地做到这一点。 我只是把我的代码,需要从viewDidLoad框架/边界的维度viewWillAppear: ,它工作正常。