带有 searchBar 跳转的导航控制器

Navigation controller with searchBar jump

我的主视图中有一个导航控制器,其中包含一个搜索栏。然后当它转到第二个视图(没有搜索栏)时,屏幕上有一点跳跃,当我回到第一个视图时,同样的事情发生了。

这是我的第一个导航控制器代码 viewController:

func configureNavBar() {
    navigationController?.navigationBar.isTranslucent = false
    navigationController?.navigationBar.barTintColor = .mainPink()
    navigationController?.navigationBar.barStyle = .black

    searchBar = UISearchBar()
    searchBar.delegate = self
    searchBar.tintColor = .white
    navigationItem.titleView = searchBar
    searchBar.showsCancelButton = true
}

第二个:

navigationController?.navigationBar.isTranslucent = false
navigationController?.navigationBar.barTintColor = .mainPink()
navigationController?.navigationBar.barStyle = .black

有什么办法可以消除这个'jump'?

这个问题实际上包含两个不同的问题:

1- 如果 "Large Navigation Bar" 导航到另一个 View Controller 时突然崩溃:

TableView 滚动是主要原因,请尝试以下操作:

self.tableView.contentInsetAdjustmentBehavior = .never

您也可以在情节提要中从 "Size Inspector" 进行设置。

根据安全区域调整滚动位置。


2- "Default Navigation Bar" 在其导航项的标题视图中包含 SearchBar 的情况:

主要原因是搜索栏默认添加高度“56”

  • 关于pushed view controller的navigation bar下出现的一条黑线,可以通过以下方法解决:

    // Inside ViewDidLoad of the Pushed View Controller
    
    self.extendedLayoutIncludesOpaqueBars = true
    

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationController?.view.setNeedsLayout() 
    navigationController?.view.layoutIfNeeded()
 }
  • 为了防止在像这样放置 SearchBar 时完全扩展 NavigationBar:

您需要创建一个具有固定高度框架的自定义视图并在其中添加此搜索栏,检查以下内容:

class SearchBarViewHolder: UIView {

let searchBar: UISearchBar  

init(customSearchBar: UISearchBar) {  
    searchBar = customSearchBar  
    super.init(frame: CGRect.zero)  

    addSubview(searchBar)  
}

override convenience init(frame: CGRect) {  
    self.init(customSearchBar: UISearchBar())  
    self.frame = frame  
}  

required init?(coder aDecoder: NSCoder) {  
    fatalError("init(coder:) has not been implemented")  
}  

override func layoutSubviews() {  
    super.layoutSubviews()  
    searchBar.frame = bounds  
}  
}

// 添加搜索栏

let searchBarViewHolder = SearchBarViewHolder(customSearchBar: searchBar)  
searchBarViewHolder.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: 44)  
navigationItem.titleView = searchBarViewHolder