是什么决定了window.frame?

时间:2013-06-05 06:55:16

标签: ios uiwindow

我一直在努力更新一些应用程序以支持iPhone 5.他们遇到了一些布局问题,这可能是因为UIWindow总是拥有iPhone 5的框架而不管它运行的是什么设备。例如,对于通用应用程序,即使在iPad上,UIWindow的框架也会设置为(0,0,320,568)。我想知道是什么原因造成的,如果这真的是我应该关注的。

1 个答案:

答案 0 :(得分:1)

我从未在通用应用程序上自行检查过,但请确保:

  1. 窗口已经是视图层次结构的一部分。新创建的窗口无法帮助您确定大小(您说在-applicationDidFinishLaunching:“)的最开始时记录frame”。

  2. frame只是一个合并boundscenter属性的访问者。如果将变换应用于视图(窗口),则无法正常工作。但是,对于窗口,通常会应用转换。

  3. 窗口的iOS绘图代码类似于以下内容:

    CGContextSaveGState(context);
    CGContextTranslateCTM(context, [window center].x, [window center].y);
    CGContextConcatCTM(context, [window transform]);
    CGContextTranslateCTM(context,
         -[window bounds].size.width * [[window layer] anchorPoint].x,
         -[window bounds].size.height * [[window layer] anchorPoint].y);
    
    [[window layer] renderInContext:context];
    CGContextRestoreGState(context);
    

    (见Technical Note QA1703

    您可以看到最终的frame尺寸取决于boundstransform。如果您进行一些实验,您可以看到,例如,即使更改了设备方向,键盘窗口也不会更改边界。纵向和横向之间的尺寸变化由transform确定。

    一般来说,window.rootViewController.bounds是可行的方法。