Тестируя элемент навигации и настройки панели поиска, которые вы описали, я мог воспроизвести только линию 1px / point во время анимации перехода.
Обходной путь : Эта строка на самом деле представляет собой представление макета фона (forLastBaselineLayout
), используемое UINavigationBar
, которое в итоге становится видимым из-за ошибочного кадрирования UISearchBar
. Установите его фон в соответствии с цветом панели навигации, чтобы скрыть его на заднем сайте
// MARK: UINavigationControllerDelegate
public func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
viewController.navigationController?.navigationBar
.forLastBaselineLayout.backgroundColor = .red // TODO:
}
Убедитесь, что для объекта, реализующего UINavigationControllerDelegate
, установлено значение navigationController.delegate
для получения вышеуказанного вызова делегата.
Кроме того (не является частью вопроса): UISearchBar
, кажется, ведет себя странно при переходе (push и pop) между контроллерами, особенно когда один имеет / показывает searchBar
, но не другой. Обходной путь , визуально мне показалось приятнее временно скрывать панель поиска от представления контроллеров. Вот код, который я использую:
public func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
if let sender = navigationStack.popLast() {
prepareSearchBarForTransition(from: sender)
}
navigationStack = navigationController.children
}
/// Set only from `navigationController: willShow`
private var navigationStack: [UIViewController] = []
func prepareSearchBarForTransition(from sender: UIViewController) {
if #available(iOS 11.0, *) {
let searchController = sender.navigationItem.searchController
sender.navigationItem.searchController = nil
weak var weakSender = sender
let navigationTransitionDuration: TimeInterval = 0.33
DispatchQueue.main.asyncAfter(deadline: .now() + navigationTransitionDuration) {
/// Reset the search bar.
weakSender?.navigationItem.searchController = searchController
}
} else {
// TODO: Check if the above workaround is neccessary for < iOS 11
}
}