Навигационный контроллер с SearchBar Jump - PullRequest
1 голос
/ 21 января 2020

У меня в главном окне есть навигационный контроллер, в котором есть панель поиска. Затем, когда он переходит ко второму представлению (без панели поиска), на экране появляется небольшой скачок, и то же самое происходит, когда я go возвращаюсь к первому представлению.

Вот мой код контроллера навигации для первого 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 Ответ

1 голос
/ 22 января 2020

Этот вопрос на самом деле содержит две разные проблемы:

1- В случае внезапного свертывания «Большой панели навигации» при переходе на другой контроллер представления:

Основная причина заключается в прокрутке TableView, Попробуйте следующее:

self.tableView.contentInsetAdjustmentBehavior = .never

Вы также можете установить его из «Инспектора размеров» в раскадровке.

Он регулирует положение прокрутки, соответствующее SafeArea.


2- Случай "Панели навигации по умолчанию", который содержит панель поиска в представлении заголовка элемента навигации:

Основная причина в том, что панель поиска по умолчанию добавляется с высотой "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()
 }
  • Чтобы вообще запретить расширение панели навигации при установке панели поиска следующим образом:

Вам необходимо создать настраиваемое представление с фиксированным высота добавьте эту строку поиска внутрь нее и проверьте следующее:

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