38

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

到目前为止,所有测试都是在纵向模式下完成的,因此我可以专注于对主要功能进行编程,然后再对横向进行一些调整。这里出现了问题:在-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation继续之前,我添加了一些日志来检查尺寸,但显然 Width 和 Height 的值是“错误的”(我说“错误”,因为乍一看这些值对我来说没有意义) .

这是一些日志记录的输出:

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

Landscape中“w”和“h”的值对我来说似乎是倒置的——我期待w=480和h=300。

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

-(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]);
}
4

3 回答 3

33

设备的方向发生了变化,而不是屏幕的物理特性。您基本上将其倾斜,但实际上它是 320 像素宽(其中 20 个由于状态栏显示而目前不可用)和 480 像素高。如果您的视图是自动旋转的,那么宽度/高度已经为您翻译了,但是当您询问屏幕的实际尺寸时,您会得到屏幕的实际尺寸。

这也是为什么在使用翻译视图时,基于视图的中心和视图的边界而不是视图的框架进行计算很重要。

于 2010-04-21T22:53:30.463 回答
27

改为使用self.view.bounds

于 2012-04-11T13:04:34.693 回答
18

我一直在遇到同样的问题,并且通过一些诊断工作,我发现视图的边界和框架不能准确地反映横向方向viewDidLoad(当视图控制器被推入堆栈时设备保持横向时),但是在viewWillAppear:和中正确执行此操作viewDidAppear:。我刚刚将需要框架/边界尺寸的代码从viewDidLoad移动到viewWillAppear:,并且它工作正常。

于 2011-05-25T20:40:58.983 回答