You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xcode10.1+Swift4.2:跳转页面时UISearchBar占位延迟消失问题

解决Push转场时UISearchBar空间延迟消失的问题

我之前也碰到过完全一样的问题!从带Large Titles和UISearchController的页面Push到新页面时,原页面的搜索栏区域会出现别扭的延迟消失动画,看起来特别不流畅。下面是我亲测有效的解决方案,结合你的代码调整就行:

一、调整ViewController A的代码

在触发转场前,手动移除原页面的搜索控制器并强制更新导航栏布局,避免转场过程中系统还在处理搜索栏的消失动画:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showLogbook" {
        // 先处理你的数据注入逻辑
        let destinationVC = segue.destination as! LogbookVC
        // ... 这里放你的数据传递代码
        
        // 添加这两行解决延迟问题
        navigationItem.searchController = nil
        navigationController?.navigationBar.setNeedsLayout()
    }
}

二、优化ViewController B的代码

你当前在viewWillAppear里配置搜索控制器的时机太晚,容易和转场动画冲突。建议把搜索控制器的配置移到viewDidLoad,同时确保相关属性设置正确:

class LogbookVC: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate, UISearchResultsUpdating {
    private let searchController = UISearchController(searchResultsController: nil)
    @IBOutlet private var addButton: UIBarButtonItem!
    @IBOutlet private var shareButton: UIBarButtonItem!
    @IBOutlet private var backButton: UIBarButtonItem!
    @IBOutlet private var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        tableView.rowHeight = 75.0
        
        // 把导航栏和搜索控制器配置移到这里
        self.navigationController?.navigationBar.prefersLargeTitles = true
        self.definesPresentationContext = true
        configureSearchController()
        
        // loading tableView data
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        fetchAndSortLogEntries()
    }
    
    private func configureSearchController() {
        navigationItem.searchController = searchController
        // 添加这行实现"默认隐藏搜索栏,下拉才显示"的需求
        navigationItem.hidesSearchBarWhenScrolling = true
        
        searchController.searchResultsUpdater = self
        searchController.searchBar.scopeButtonTitles = ["Newest", "Oldest"]
        searchController.searchBar.delegate = self
        searchController.searchBar.barStyle = .black
        searchController.searchBar.tintColor = K.Colors.appMid
        searchController.searchBar.keyboardAppearance = .dark
        searchController.searchBar.returnKeyType = .done
        searchController.dimsBackgroundDuringPresentation = false
        // 确保这个属性为false,避免导航栏被意外隐藏
        searchController.hidesNavigationBarDuringPresentation = false
        
        let attributes = [NSAttributedString.Key.foregroundColor: K.Colors.appMid]
        UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes(attributes, for: .normal)
        searchController.searchBar.setValue("Reset", forKey: "_cancelButtonText")
        let searchBarCancelButton = searchController.searchBar.value(forKey: "cancelButton") as? UIButton
        searchBarCancelButton?.setTitle("Reset", for: .normal)
    }
}

问题根源说明

这个bug本质是iOS系统处理带搜索控制器的导航栏转场时,布局动画的时序冲突。提前移除原页面的搜索控制器,同时在目标页面提前完成搜索控制器的配置,就能让转场动画流畅衔接,不会出现延迟消失的空白区域。

内容的提问来源于stack exchange,提问作者rbaldwin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:22:56