带搜索栏跳转的导航控制器

Posted

技术标签:

【中文标题】带搜索栏跳转的导航控制器【英文标题】:Navigation controller with searchBar jump 【发布时间】:2020-01-21 17:49:20 【问题描述】:

我的主视图中有一个导航控制器,其中包含一个搜索栏。然后当它进入第二个视图(没有 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

有没有办法消除这种“跳跃”?

【问题讨论】:

在下面查看我的答案,如果可行,请告诉我。 @AmrEl-Sayed 很遗憾没用。 你能给我们看一张tableview约束的截图吗?我说的是 SecondViewController。 第二个VC只显示第一个tableView VC中选择的项目,那里没有tableView。 我已经尝试过你的代码来得到你想要的。请在下面找到我的更新答案。我希望它能正常工作。 【参考方案1】:

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

1- 如果“大导航栏”在导航到另一个视图控制器时突然崩溃:

TableView滚动是主要原因,试试以下方法:

self.tableView.contentInsetAdjustmentBehavior = .never

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

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


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

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

关于push view controller的导航栏下方出现一条黑线,可以通过以下方式修复:

// 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  

【讨论】:

以上是关于带搜索栏跳转的导航控制器的主要内容,如果未能解决你的问题,请参考以下文章

mui tab bar 底部导航栏跳转页面。不用pluseady 因为不支持

element-ui使用导航栏跳转路由用法

Boostrap导航栏跳转到其他页面或外部链接

如何在小程序导航栏放一个搜索框?

带导航栏的搜索控制器

UINavigationController导航控制器