在导航栏中显示搜索栏,而无需在iOS 11上滚动


79

我将UISearchController附加到navigationItem.searchControlleriOS 11上的UITableViewController的属性。正常工作:我可以使用漂亮的iOS 11样式的搜索栏。

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

在此处输入图片说明 在此处输入图片说明

左:启动后的默认情况。右:使搜索栏可见(向上滚动)。我想在启动后显示搜索栏,如右图所示。

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


在其中添加代码的位置hidesSearchBarWhenScrolling
Anbu.Karthik,2017年

1
设置为sfirstResponder呢?
米兰诺萨(MilanNosáľ)

2
以下选定的答案对我来说很有用,但是当我以编程方式滚动到顶部时,我也想重新显示搜索控制器scrollView.setContentOffset(_:animated)。有人有建议吗?
贾斯汀·瓦利

@JonathanhidesSearchBarWhenScrolling = false在iOS 13中将搜索栏放在大标题上方。我能以某种方式进行更新吗?
Bonnke

Answers:


185

以下内容使搜索栏首先可见,然后使其在滚动时隐藏:

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
    }
}

使用isActive不执行我想要的操作时,当我想要显示的所有内容时,它会使搜索栏处于活动状态(显示“取消”按钮等)。


谢谢,为我工作。虽然有趣的解决方案:)
Mikrasya '17

9
此解决方案有效,但是如果您先前还隐藏了导航栏(例如,将带有搜索栏的视图推到导航堆栈上)也显示了导航栏,则会产生副作用。看起来很糟糕:(
Matthew Crenshaw

11
如果您放第一部分viewDidLoad而不是viewWillAppear
Marc-AlexandreBérubé18年

1
有人可以详细说明为什么它起作用以及为什么searchController.searchBar.isHidden = false在viewDidLoad中不起作用吗?后者对我来说似乎更合乎逻辑
pho_pho

5
从子屏幕返回时,这会导致iOS 13中的视觉错误。
nemissm '19

5

在将searchController添加isActivetrue后,可以将属性设置为navigationItem

像这样:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    searchController.isActive = true
}

没有设置方法'setIsActive:'
Nikolay

您是对的,@ NikolayKrasnov。isActive是只读布尔值。您将要使用searchController.active = true
Mark Jeschke

2

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

navigationController?.navigationBar.prefersLargeTitles = true
navigationController!.navigationBar.sizeToFit()

0

在iOS 13上,@ Jordan Wood的答案无效。相反,我做了:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    UIView.performWithoutAnimation {
        searchController.isActive = true
        searchController.isActive = false
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.