window是[[window rootViewController] view]的超级视图吗

Posted

技术标签:

【中文标题】window是[[window rootViewController] view]的超级视图吗【英文标题】:Is window the super view of [[window rootViewController] view] 【发布时间】:2013-12-06 07:22:24 【问题描述】:

问题

应用程序的窗口(@98​​7654325@ 类型,app delegate 中的一个属性)是[[window rootViewController] view] 的超级视图吗?

我在应用程序委托方法application:didFinishLaunchingWithOptions: 中的代码是[self window setRootViewController:[self myNavigationController]]self 指的是应用程序委托)。请注意,我没有写[self window addSubview:[[self myNavigationController] view]];

我使用非 ARC、Xcode 5、ios 7 以编程方式创建所有视图(没有故事板、没有界面构建器)。

问题的背景

之所以需要知道这个问题,是因为我想给[[window rootViewController] view]的超级视图添加一个topLayoutGuide约束,其中窗口的rootViewController是一个导航控制器。

虽然我不确定是否最好创建一个自定义的容器视图控制器来包含导航控制器,以便我们可以将topLayoutGuide 约束添加到容器视图控制器的视图中(现在显然它是导航控制器的视图)。

我需要添加topLayoutGuide 约束的原因是,当我通过更改导航控制器视图的框架来显示/隐藏导航栏时,我的代码似乎存在错误。当我通过将框架的原点的 y 坐标移动 64 点(状态栏的 20 点加上导航栏的 44 点的高度)来设置导航控制器视图的框架(也是 [[window rootViewController] 视图])时,导航控制器的内容视图仅在 iOS 7 的导航栏下方意外移动了另外 20 个点。这种意想不到的行为让我想起了a problem solved by adding topLayoutGuide。

【问题讨论】:

【参考方案1】:

当您将根控制器分配给窗口时,控制器的根视图将成为窗口的子视图。所以是的,窗口是 window.rootViewController.view 的超级视图。

不确定为什么要通过更改导航控制器的框架来隐藏导航栏。导航控制器为此内置了功能:Navigation bar show/hide

【讨论】:

谢谢@yurish。在我做上述动作之前,我尝试使用[[self navigationController] setNavigationBarHidden:YES animated:YES];,它会在窗口底部给出一个320点宽和64点高的空白区域,这样我的导航控制器视图的内容视图(即web 视图)没有响应点击事件(仅在 iOS 7 中),即使我将该内容视图的高度增加了 64 点。 布局设置有问题。您对根视图有高度限制吗?无论如何,最好使用 setNavigationBarHidden 隐藏栏并找到布局问题所在。 致@yurish 推荐什么样的高度限制? 你不应该把它放在根视图上。 谢谢! @yurish,一个解决方案(虽然苹果的原则不推荐)是使用 [[self navigationController] setNavigationBarHidden:YES animated:YES];添加了 topLayoutGuide,代码可以在这里找到:***.com/questions/20418548/…

以上是关于window是[[window rootViewController] view]的超级视图吗的主要内容,如果未能解决你的问题,请参考以下文章

将 UITableView 推送到 UITableView

windows是啥?

js中Window和window的区别是啥

什么是windows???

windows是啥?

Windows 8 Release Preview 是啥