带有searchBar跳转的导航控制器

时间:2020-01-21 17:49:20

标签: ios swift uinavigationcontroller uinavigationbar

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

这是我的第一个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

有什么办法可以消除这种“跳跃”?

1 个答案:

答案 0 :(得分:2)

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

1-如果导航到另一个View Controller时“大型导航栏”突然崩溃:

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

self.tableView.contentInsetAdjustmentBehavior = .never

您也可以从情节提要中的“大小检查器”进行设置。

它根据SafeArea调整其滚动位置。


2-“默认导航栏”在其导航项的标题视图中包含SearchBar的情况:

主要原因是默认情况下搜索栏的高度为“ 56”

  • 关于出现在推送视图控制器的导航栏下方的黑线,因此您可以使用以下方法进行修复:

    // 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扩展:

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

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  
相关问题