在导航栏中显示搜索栏而不在iOS 11上滚动

Jon*_*han 66 uinavigationitem ios uisearchcontroller

我将UISearchController附加到navigationItem.searchControlleriOS 11上的UITableViewController 的属性.这很好用:我可以使用漂亮的iOS 11风格的搜索栏.

但是,我想在发布时使搜索栏可见.默认情况下,用户必须在表格视图中向上滚动才能看到搜索栏.有谁知道这有可能吗?

在此输入图像描述 在此输入图像描述

左:启动后的默认情况.右:搜索栏可见(通过向上滚动).我希望在发布后可以看到搜索栏,如右侧屏幕截图所示.

我已经发现通过将hidesSearchBarWhenScrolling导航项的属性设置为false 可以使搜索栏可见.但是,这会导致搜索栏始终可见 - 即使向下滚动 - 这也不是我想要的.

Jor*_*ood 159

以下内容使滚动条首先可见,然后在滚动时允许它隐藏:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.hidesSearchBarWhenScrolling = false
    }
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.hidesSearchBarWhenScrolling = true
    }
}
Run Code Online (Sandbox Code Playgroud)

使用isActive没有做我想要的,它使滚动条激活(显示取消按钮等),当我想要的是它是可见的.

  • 此解决方案有效,但如果您之前隐藏了导航栏(即将此视图与搜索栏推到导航堆栈上),则会出现副作用.搜索栏将在导航栏动画时显示为静态.看起来很糟糕:( (8认同)
  • 如果你将第一部分放在`viewDidLoad`而不是`viewWillAppear`中,那就没有了 (7认同)
  • 这会导致 iOS 13 从子屏幕返回时出现视觉错误。 (5认同)

txa*_*idw 5

您可以将属性设置isActivetrue加入searchController到后navigationItem

像这样:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    searchController.isActive = true
}
Run Code Online (Sandbox Code Playgroud)


小智 5

对我来说,在方法中添加以下行后它就起作用了viewDidLoad()

navigationController?.navigationBar.prefersLargeTitles = true
navigationController!.navigationBar.sizeToFit()
Run Code Online (Sandbox Code Playgroud)