在iPhone中重新定位后,“不正确”的框架/窗口大小

时间:2010-04-21 22:05:19

标签: iphone uiview frame

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

到目前为止,所有测试都是在纵向模式下完成的,所以我可以专注于编写主要功能,然后再对Landscape进行一些调整。这里输入问题:在-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation我添加了一些日志记录来检查大小,然后继续,但显然宽度和高度的值是“错误的”(我说“错误”,因为乍一看值不对我有意义)。

以下是一些日志记录的输出:

  • 轮换:横向[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]);
}

3 个答案:

答案 0 :(得分:33)

设备的方向发生了变化,而不是屏幕的物理特性。你基本上把它放在一边,但实际上它是320像素宽(其中20个在状态栏显示后暂时无法使用)和480像素高。如果您的视图是自动旋转的,那么宽度/高度已经为您翻译,但是当您询问屏幕的实际尺寸时,您将获得屏幕的实际尺寸。

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

答案 1 :(得分:27)

改为使用self.view.bounds

答案 2 :(得分:18)

我一直在绊倒同样的问题,并且通过一些诊断工作,我发现视图的边界和框架没有准确地反映viewDidLoad中的横向方向(当视图控制器中设备被保持在横向时被推入堆栈),但在viewWillAppear:viewDidAppear:中正确执行。我刚刚移动了需要从viewDidLoadviewWillAppear:的框架/边界维度的代码,并且它运行正常。