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
相关产品推荐
相关产品推荐

