在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:
,它工作正常。