如何关闭UINavigationBar的大标题?

23

我有一个UITableView和一个嵌入在UINavigationController中的详细视图,如下所示:enter image description here我想为“我的笔记”打开大标题,但是我想在详细视图中关闭它。就像iPhone上默认的邮件应用程序一样。在该过渡期间,我该如何改变导航栏的prefersLargeTitle属性?

9个回答

31

非常简单。

在您的DetailView中,您应该将navigationItem.largeTitleDisplayMode设置为.never(而不是navigationController?.navigationItem.largeTitleDisplayMode !!)

navigationItem.largeTitleDisplayMode = .never

19

SwiftUI版本

.navigationBarTitle("Title", displayMode: .inline)

iOS 14及以上版本更新:

.navigationTitle("Details")
.navigationBarTitleDisplayMode(.inline)

对于未来的iOS发布,该方法将被移除。应使用以下方法替代:.navigationBarTitleDisplayMode(.inline)。此外,导航标题可以使用.navigationTitle("Details")设置。 - dvp.petrov

6
以下任意一种方法都可以解决您的问题:
- 使用下列其中之一即可: - - 方法1 - 方法2
  1. set prefersLargeTitles to false for your navigationBar

    self.navigationController?.navigationBar.prefersLargeTitles = false
    
  2. set largeTitleDisplayMode to never for navigationItem (note: prefersLargeTitles must be false otherwise this won't work)

    self.navigationController?.navigationItem.largeTitleDisplayMode = .never
    
注意:如果 prefersLargeTitles 为 true,则设置 largeTitleDisplayMode = .never 无效。导航栏的小标题显示取决于 prefersLargeTitles
如果值为 true,则启用大标题模式。
self.navigationController?.navigationBar.prefersLargeTitles = true

3
这是不正确的。 prefersLargeTitles 不必为 false 才能符合 #2 要求。当 prefersLargeTitles 为 true 时,largeTitleDisplayMode = .never 绝对有效。 - Elijah
值得注意的是,这仅适用于iOS 11及以上版本。 - Abandoned Cart
1
只想指出,在我的情况下,无论是#1还是#2都需要(仅#2是不够的),即使在Storyboard中设置了navigationItem的“Never”优先使用大标题标志。 - Luke

6

我刚刚遇到了同样的问题。

我的使用情况:

MasterVC: 基本导航栏,没有大标题

DetailVC: 启用了大标题

--> 当从 DetailVC 返回到 MasterVC 时,我看到一个奇怪的动画,在返回到基本非大标题布局之前,在 Master 上显示了一个大标题。它看起来像是一个故障。

我通过以下方法解决了这个问题:

在 MasterVC 中 - viewDidLoad

if #available(iOS 11.0, *) {
     navigationItem.largeTitleDisplayMode = .never
     navigationController?.navigationBar.prefersLargeTitles = false
}

在 DetailVC 中 - viewDidLoad

if #available(iOS 11.0, *) {
     navigationItem.largeTitleDisplayMode = .always
     navigationController?.navigationBar.prefersLargeTitles = true
} 

我希望这能帮助其他人。


6
需要翻译的内容如下:

需要注意的是,如果您将largeTitleDisplayMode设置为never,并在详细ViewController上将prefersLargeTitles设置为false,则在通过UINavigationBar返回按钮从详细ViewController移动到上一个ViewController时,小标题仍将显示一秒钟。

使用willMove(toParent:)函数在执行segue之前将标题更改回来。

Swift 4


override func willMove(toParent parent: UIViewController?) {
    navigationItem.largeTitleDisplayMode = .always
    navigationController?.navigationBar.prefersLargeTitles = true
}

5
    if #available(iOS 11.0, *) {
        self.navigationItem.largeTitleDisplayMode = UINavigationItem.LargeTitleDisplayMode.never
    } else {
        // Fallback on earlier versions
    }

1
你应该在回答中提供更多的上下文。这段代码将被用在哪里?它是做什么的? - picsoung
1
@NicolasGrenié,iOS中的属性是自描述的,因此代码非常清晰。相反,您的评论似乎匆忙留下,甚至可能是由机器人生成的。 - kelin
UINavigationItemLargeTitleDisplayModeNever 也可以使用,因为这里的暗示是您无法访问 .never。@NicolasGrenié 在担心标题栏大小之前,您可能需要考虑一些基本教程。 - Abandoned Cart

4

虽然有点晚了,但这对某些人可能还是有用的...

将以下代码包含在您的详细视图控制器中的viewDidLoad下方:

navigationItem.largeTitleDisplayMode = .never

2

SwiftUI:

步骤1:使用ZStack 步骤2:.navigationBarTitle(“”,displayMode:.inline)


1
我遇到了同样的问题,需要在第二个视图控制器的故事板上放置一个 NavigationItem。我的 NavigationItem 由 segue 自动创建,在 viewDidLoad() 中的 prefersLargeTitle 在视图出现之前没有完成加载。将 NavigationItem 添加到故事板中解决了这个问题,并允许我在故事板的属性菜单中设置 prefersLargeTitle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接