在我的iPhone OS应用程序中,我希望(需要)观察设备方向的变化,以便重新排列屏幕的某些部分。我使用的方法是使用CGRect frame = [UIScreen mainScreen].applicationFrame
来获取屏幕大小,并从那里计算其他控件的大小和/或位置(我也试过self.view.frame
)。
到目前为止,所有测试都是在纵向模式下完成的,所以我可以专注于编写主要功能,然后再对Landscape进行一些调整。这里输入问题:在-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
我添加了一些日志记录来检查大小,然后继续,但显然宽度和高度的值是“错误的”(我说“错误”,因为乍一看值不对我有意义)。
以下是一些日志记录的输出:
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]);
}
答案 0 :(得分:33)
设备的方向发生了变化,而不是屏幕的物理特性。你基本上把它放在一边,但实际上它是320像素宽(其中20个在状态栏显示后暂时无法使用)和480像素高。如果您的视图是自动旋转的,那么宽度/高度已经为您翻译,但是当您询问屏幕的实际尺寸时,您将获得屏幕的实际尺寸。
这也是为什么在处理翻译的视图时,重要的是根据视图的中心和视图的边界进行计算,而不要在视图的框架上进行计算。
答案 1 :(得分:27)
改为使用self.view.bounds
。
答案 2 :(得分:18)
我一直在绊倒同样的问题,并且通过一些诊断工作,我发现视图的边界和框架没有准确地反映viewDidLoad
中的横向方向(当视图控制器中设备被保持在横向时被推入堆栈),但在viewWillAppear:
和viewDidAppear:
中正确执行。我刚刚移动了需要从viewDidLoad
到viewWillAppear:
的框架/边界维度的代码,并且它运行正常。