【问题标题】:Container View getting pushed down as if it had a UINavigationBar?Container View 像 UINavigationBar 一样被下推?
【发布时间】:2013-09-24 06:33:07
【问题描述】:

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

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

self.navigationController.navigationBar.translucent = NO;

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

这里有什么我遗漏的吗?

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

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

当半透明 = YES

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

半透明时 = 否

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

附:我的观点比这更复杂,我只是在简单化。

【问题讨论】:

  • 视图是否在滚动视图中被下推?如果是这样,在主视图控制器上设置self.automaticallyAdjustsScrollViewInsets = NO;。实际上,是的,它是一个 TVC,所以你需要这个。
  • @Fogmeister 为我工作...谢谢!
  • @Fogmeister 也为我工作。谢谢。
  • @Fogmeister 谢谢一群老兄!拯救了我的一天
  • @Fogmeister 你 2013 年的评论在 2017 年救了我!

标签: ios objective-c uiviewcontroller uikit ios7


【解决方案1】:

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

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

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

【讨论】:

  • 我正在使用自动布局。我该怎么办?
  • 这取决于您的详细实现,但我想说最简单的方法是仅对容器视图使用以下约束:前导空间到超级视图,底部空间到超级视图和高度。这样,您将视图锚定到左下角而不是(默认)左上角
  • 非Auto Layout的情况呢?
  • @Fogmeister 对这个问题的评论对我有用
  • 修复是self.navigationController.automaticallyAdjustsScrollViewInsets = false。原因是navigationcontroller 为滚动视图添加了额外的内容插入,使tableview 在透明导航栏下可见。查看更多信息:useyourloaf.com/blog/extra-space-when-embedding-table-views
【解决方案2】:

我通过在-viewDidLoad 中添加这行代码解决了这个问题:

self.extendedLayoutIncludesOpaqueBars = YES;

【讨论】:

    【解决方案3】:

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

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


    详情:

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

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

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

    (要打开情节提要源代码:在 Xcode 中的项目导航器中右键单击情节提要文件。选择“在 Finder 中显示”,然后在 Finder 窗口中,右键单击文件并选择“打开方式...”并选择文本编辑。)

    编辑: (不知道是不是一直都在,但是可以在项目导航器中右键storyboard文件,选择“Open As”->“Source Code”,不用去Finder。)

    【讨论】:

    • 花了超过 2 周的时间寻找解决此问题的方法。你太棒了。
    • 对于那些想要在使其半透明后保留浅灰色条颜色事件的人,只需将条色调更改为#f9f9f9
    【解决方案4】:

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

    【讨论】:

    • 只是想补充一点,我必须在包含表格视图的视图控制器中取消选择它,并在导航控制器中保持选中状态
    【解决方案5】:

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

    1. 转到属性检查器
    2. 勾选标题为Under Opaque Bar的复选框,选择“Extend Edges”

    已附上截图

    我正在使用 Xcode 9。

    谢谢

    【讨论】:

      【解决方案6】:

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

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

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

      edgesForExtendedLayout = []

      适用于 iOS 7.0

      Source

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          设置tableView.opaque = false 对我有用

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-04-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-26
            相关资源
            最近更新 更多