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

Raf*_*eil 38 iphone frame uiview

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

所有测试都是在Portrait模式下完成的,所以我可以专注于编写主要功能,然后再对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]);
}
Run Code Online (Sandbox Code Playgroud)

Jas*_*oco 33

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

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

  • 翻译视图(通过自动旋转)不会影响视图的框架?你能解释得更多还是你知道与这个原则相关的链接?我有点迷惑不解了.提前致谢. (4认同)

Mik*_*nov 27

self.view.bounds改用.


小智 18

我一直在绊倒同样的问题,并且通过一些诊断工作,我发现视图的边界和框架不能准确地反映横向方向viewDidLoad(当视图控制器被推入堆栈时设备被保持在横向中),但是在viewWillAppear:和中正确地这样做viewDidAppear:.我只是提出我的代码所需要的帧/边界的尺寸从viewDidLoadviewWillAppear:,和它的工作正常.