【问题标题】:How to add View above navigation controller? [closed]如何在导航控制器上方添加视图? [关闭]
【发布时间】:2018-06-21 01:36:13
【问题描述】:

我想向 TabBarController 添加一个视图,但要在其中的任何 NavigationController 上方,以便将其向下推。在图像中的 Apple Music 应用程序中看到的东西(顶部紫色渐变视图)。它显示在所有屏幕上,就像在 TabBar 控制器中一样

我向自定义 TabBarController 添加了一个视图,但无法将 NavigationController 向下移动:

navController.view.frame = CGRect(x: 0, y: 80, width: view.frame.width, height: view.frame.height)

我怎样才能做到这一点?

【问题讨论】:

  • 您将创建一个带有按钮的自定义视图并告诉它在那里实例化。这可以通过单独的故事板或以编程方式完成。还有其他可用的教程。
  • 能否详细解释一下?
  • 您可以创建一个 VC 并在其中添加任何带有任何框架的子项,顶部的 blueView 和底部的标签栏
  • 我会说这是一个独立于任何导航控制器的视图。可能它使用一些视图控制器包含在任何嵌入式视图控制器上方显示通知,因为迷你播放器也很可能是这样实现的。
  • @OluwatobiOmotayo:可能是因为没有表现出任何认真的努力。

标签: ios swift


【解决方案1】:

您可以随时将您的View 作为子视图添加到Navigation Bar

if let navigationBar = self.navigationController?.navigationBar {
   let yourView = //instantiate your view either using xib or from code
    navigationBar.addSubview(yourView)
}

这是我使用的代码

if let navBar = self.navigationController?.navigationBar, let customView = Bundle.main.loadNibNamed("SomeHeaderView", owner: self, options: nil)![0] as? UIView {
        navBar.addSubview(customView)
        customView.translatesAutoresizingMaskIntoConstraints = false
        customView.leadingAnchor.constraint(equalTo: navBar.leadingAnchor, constant: 0).isActive = true
        customView.trailingAnchor.constraint(equalTo: navBar.trailingAnchor, constant: 0).isActive = true
        customView.topAnchor.constraint(equalTo: navBar.topAnchor, constant: 0).isActive = true
        customView.heightAnchor.constraint(equalToConstant: 100).isActive = true
    }

添加的子视图简单明了。它具有红色背景颜色和标签。只是为了展示如何为 subView 添加额外的高度,我也添加了高度约束

这里是O/P

就状态栏颜色而言,您始终可以使用here提供的答案将颜色设置为状态栏

希望对你有帮助

【讨论】:

  • @downvoter:需要解释一下吗?
  • 为什么不投射自定义视图一次?
  • let customView = Bundle.main.loadNibNamed("SomeHeaderView", owner: self, options: nil)![0] as! UIView
  • @vikingosegundo :是的,我会急着发布答案,因为有人已经投了反对票:)
  • @vikingosegundo : 正在努力,先生 :)
【解决方案2】:

您需要做的是让导航控制器成为根视图,并添加标签栏控制器,因为它是嵌入式 VC。 (内嵌的VC称为导航控制器的根视图控制器)

我不确定您是如何构建视图层次结构的,但如果您想这样做

故事板

  1. 将导航控制器拖到情节提要上(从右下角搜索,第三个选项卡看起来像一个带有正方形的圆圈)
  2. 删除作为嵌入式 VC 出现的默认表视图
  3. 将标签栏控制器拖到情节提要上
  4. 在键盘上按住control 的同时,从导航控制器拖动到标签栏控制器。
  5. 按下“Relationship segue”选项,根视图控制器

您现在有一个嵌入到导航控制器中的标签栏控制器。

以编程方式

使用其中一个初始化器,例如:

UINavigationController(rootViewController: <UIViewController>) UINavigationController(navigationBarClass: <AnyClass?>, toolbarClass: <AnyClass?>)

rootViewController 是您的标签栏控制器。 您可以使用 setViewControllers 方法向其传递一个数组,如果您不使用 rootViewController 初始化程序,该数组可能仅包含您的标签栏。

导航控制器将始终显示导航栏,除非您明确隐藏它。如果您希望您的导航控制器看起来不同于默认值,您还可以子类化导航栏和导航控制器,例如在 Apple Music 应用中。

编辑

因此,由于问题实际上似乎是关于在条形下方/上方扩展布局,因此将我的评论粘贴到此处:

所以澄清一下,导航控制器是整个屏幕。顶部的栏称为导航栏,可通过self.navigationController?.navigationBar 访问。

无论根视图控制器是什么(无论它是否是选项卡)内容都会默认显示在半透明条下。

现在有几种方法可以防止内容进入/超出栏。最简单的方法是使用navigationController?.navigationBar.translucent = false,因为默认情况下内容不会出现在不透明的条形下方。

也可以navigationController?.edgesForExtendedLayout = []

查看 UINavigationController 上的 extendedLayoutInclludesOpaqueBarsedgesForExtendedLayout 属性。

【讨论】:

  • 我试过这个,但它会影响 tabbarcontroller 内导航控制器的大小。顺便说一句,我以编程方式执行此操作。导航栏被剪裁,导航栏标题和后退按钮不显示
猜你喜欢
  • 2013-10-19
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 2011-10-12
  • 1970-01-01
  • 2017-01-07
相关资源
最近更新 更多