带有大标题的 UISearchController,UI 在关闭时行为不端

Posted

技术标签:

【中文标题】带有大标题的 UISearchController,UI 在关闭时行为不端【英文标题】:UISearchController with Large titles, UI misbehave on dismissing 【发布时间】:2020-06-02 07:58:16 【问题描述】:

我有一个 UITableViewController,它在导航栏中有一个 UISearchController。

当我点击搜索、下拉一次然后按取消时,我看到了一个奇怪的 UI 行为。

我找不到发生这种情况的任何具体原因。这个问题不是每次都重现。当导航栏有一些按钮时,这种情况会更频繁地发生,如您在上面的 GIF 中所见。

当我返回第一个视图控制器(没有任何导航栏按钮)并重复相同的步骤时,该问题在极少数情况下会重现。

仅当您在具有搜索控制器的 ViewController 中下拉时才会出现此问题。如果您使用结果控制器并在结果控制器中下拉,则不会重现此问题。

以下是示例应用程序中使用的代码。

import UIKit

class SearchViewController: UITableViewController 

    lazy var resultsController = ResultsVC()
    lazy var searchController = UISearchController(searchResultsController: resultsController)

    override func viewDidLoad() 
        super.viewDidLoad()

        configureSearchController()

        navigationItem.largeTitleDisplayMode = .always
        navigationController?.navigationBar.prefersLargeTitles = true
        navigationItem.title = "Search VC"
    

    func configureSearchController() 
        navigationItem.searchController = searchController
        navigationItem.hidesSearchBarWhenScrolling = true
        searchController.obscuresBackgroundDuringPresentation = false
        searchController.hidesNavigationBarDuringPresentation = true
        searchController.searchResultsUpdater = resultsController
    

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        tableView.deselectRow(at: indexPath, animated: true)
        navigationController?.pushViewController(SearchViewController(), animated: true)
    

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 50
    

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = UITableViewCell()
        cell.textLabel?.text = "Searchable cell"
        return cell
    


class ResultsVC: UITableViewController 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 50
    

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = UITableViewCell()
        cell.textLabel?.text = "Result cell"
        return cell
    


extension ResultsVC: UISearchResultsUpdating 
    func updateSearchResults(for searchController: UISearchController) 
        print(searchController.searchBar.text)
    

我尝试在 UISearchControllerDelegate 方法 willPresentSearchControllerwillDismissSearchController 中使用 tableView.setContentOffet 更改 tableView 的内容偏移量,但 y 位置因每个设备而异,它不能成为通用修复。

PS:大多数模拟器不会出现此问题。因此,请在您的手机中尝试相同的代码。

【问题讨论】:

【参考方案1】:

这个问题可以通过设置来避免发生

searchController.obscuresBackgroundDuringPresentation = true

这意味着用户在点击搜索后无法滚动表格视图。但是,用户可以在结果控制器出现后滚动它。

【讨论】:

以上是关于带有大标题的 UISearchController,UI 在关闭时行为不端的主要内容,如果未能解决你的问题,请参考以下文章

带有 UITableView ui 故障的 UISearchController

Swift - 带有单独 searchResultsController 的 UISearchController

带有 UISearchController 的 resultController 中的空白结果

UISearchController 位置错误,因为带有 tableview 插图

带有 UISearchController 的 UITableView 在进入结果视图并返回时进入导航栏

删除大标题 UINavigationBar 中 UISearchController 顶部的 1px 行