46

我有一个带有容器视图的 UIViewController。这个容器视图包含一个 UITableViewController。

UIViewController 嵌入在 UINavigationController 中。我通过更改色调颜色、栏色调颜色和标题文本属性来配置 NavigationBar,但是当我尝试更改半透明度时出现问题。我通过删除所有其他自定义代码来挑出问题。每当我在 UIViewController 中这样做时-viewDidLoad

self.navigationController.navigationBar.translucent = NO;

Container View 在自身顶部添加了一些空间,就好像它有自己的导航栏一样。每当我将半透明设置为 YES 时,视图都会正确显示所有内容。每当我将半透明设置为 NO 时,这只发生在包含的视图上。

有什么我在这里想念的吗?

我尝试YES在包含的视图上设置半透明并将其设置为隐藏,但没有任何效果。不知何故,包含的视图继承了父容器的属性?每当我将半透明设置为 时,如何避免在包含的视图上创建这个额外的空间NO

我希望设置半透明只会影响半透明,但不会影响视图的位置。

当半透明 = YES

+---------------------------------+
|                                 |
|     UINavigationBar             |
|                                 |
+---------------------------------+
|                                 |
|                                 |
|                                 |
|                                 |
|                                 |
|    UITableViewController        |
|    in a Contained View          |
|                                 |
|                                 |
|                                 |
|                                 |
|                                 |
|                                 |
+---------------------------------+

半透明时 = 否

+---------------------------------+
|                                 |
|     UINavigationBar             |
|                                 |
+---------------------------------+
|                                 |
|blank space created on top of view
|                                 |
+---------------------------------+
|                                 |
|                                 |
|                                 |
|                                 |
|                                 |
|                                 |
|     UITableViewController       |
|     in a Contained View         |
|                                 |
+---------------------------------+

PS我的观点比这更复杂,我很简单。

4

8 回答 8

35

您在这里缺少的是一个半透明的导航栏位于您的视图控制器的视图之上,而一个非半透明的导航栏会向下推您的视图控制器的视图(有效地调整它的大小)。

因此,这里发生的情况是,对于半透明导航栏,空白区域实际上隐藏在栏下方,而当栏不透明时,它被“向下推”。

有很多方法可以解决它,主要取决于您是否使用自动布局。

于 2013-09-19T09:13:10.317 回答
24

我通过在以下代码中添加这行代码来解决此问题-viewDidLoad

self.extendedLayoutIncludesOpaqueBars = YES;
于 2016-11-17T10:59:44.920 回答
17

如果故事板出现此问题(未触及代码中的半透明属性),我发现检查 NavigationBar 设置以及(如有必要)故事板源文件很有帮助。

(这并不完全适用于这个问题,但是当我搜索这个问题时,基本上只弹出这个问题,也许这些信息可以帮助其他人解决同样的问题。)


细节:

要在故事板编辑器中访问导航栏: 显示文档大纲(菜单编辑器 -> 显示文档大纲),选择导航栏。

文档大纲中的导航栏

然后在属性检查器右侧的实用程序窗格中确保未选中“半透明”。

半透明属性

如果这没有帮助,请在 TextEdit 中打开情节提要文件,查找navigationBar元素并检查opaquetranslucent属性。你想要translucent="NO"

故事板源

(要打开故事板源:在 Xcode 中的项目导航器中右键单击故事板文件。选择“在 Finder 中显示”,然后在 Finder 窗口中,右键单击文件并选择“打开方式...”并选择 TextEdit。)

编辑:(我不知道它是否一直在那里,但是可以在项目导航器中右键单击情节提要文件并选择“打开为”->“源代码”。无需转到 Finder .)

于 2014-04-21T07:08:10.647 回答
3

我通过进入 IB > 选择视图 > 取消选择“调整滚动条插图”解决了这个问题

于 2016-04-12T05:45:19.350 回答
3

上述答案中提到的内容对我不起作用。当半透明为NO时,我的ViewController向下推,它嵌入在导航控制器中。对我有用的解决方案如下所示

  1. 转到属性检查器
  2. 通过勾选标题为“不透明条下”的复选框来选择“扩展边缘”

截图已附上

在此处输入图像描述

我正在使用 Xcode 9。

谢谢

于 2018-02-21T04:04:15.067 回答
1

从 iOS 7.0 开始,所有视图都自动位于导航栏、工具栏和标签栏后面,以提供 Apple 所谓的“上下文”——了解 UI 下方的内容(尽管被磨砂玻璃效果模糊)让用户了解什么否则就在屏幕外。

如果这妨碍了你(老实说,它确实经常妨碍你)你可以通过修改它的 edgesForExtendedLayout 属性来轻松地为给定的视图控制器禁用它。

例如,如果您不希望视图控制器位于任何栏后,请使用以下命令:

edgesForExtendedLayout = []

适用于 iOS 7.0

资源

于 2017-09-25T15:11:18.260 回答
0

这纯粹是因为您的自动布局问题,可能是您在开始时隐藏了一些视图,只需显示所有视图并检查空间是否仍然存在

于 2017-07-20T06:03:44.500 回答
-4

tableView.opaque = false为我设置工作

于 2016-01-24T14:07:14.157 回答