ios - 什么决定了window.frame?

标签 ios uiwindow

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

最佳答案

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

  1. 窗口已经是 View 层次结构的一部分。新创建的窗口不会帮助您确定大小(您说您记录 frame“在 -applicationDidFinishLaunching: 的开头”)。

  2. frame 只是一个访问器,它合并了 boundscenter 属性。如果将转换应用于 View (窗口),它就无法正常工作。但是,对于窗口,通常会应用转换。

窗口的 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 是可行的方法。

关于ios - 什么决定了window.frame?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16933391/

相关文章:

ios - 为什么 UIGraphicsGetCurrentContext() 在全局可用?

ios - info.plist 中的可执行文件名应该是什么?

ios - 如何创建一个将所有事件延迟 200 毫秒的 UIWindow?

Objective-C:如何从 UIWindow 中只删除一个 subview ?

ios - UIWindow rootviewcontroller - 方向错误

iOS:创建另一个 UIWindow 作为覆盖时出现问题(iOS 7 问题?)

ios - 如何判断 ViewController View 是否可见

ios - 我可以在两个 UITableViewCell 之间构建一个 UITableView 吗?

ios - 关于 NSLocale 的 iOS 命名顺序习惯

c# - MonoGame SpriteFont 无法在 iOS 上运行