UISearchController не работает должным образом с непрозрачным UINavigationBar

В настоящее время я пытаюсь внедрить UISearchController в свое приложение. Но UISearchBar, который является свойством UISearchController, не отображается должным образом, если UINavigationBar не полупрозрачный. Обычно после касания свойства UISearchBar UINavigationBar перемещается вверх, освобождая место для UISearchBar. Результат вы можете увидеть на следующем скриншоте:

https://www.dropbox.com/s/172k63zr2bhj84t/Normal_behaviour.png?dl=0< /а>

Но если для свойства «полупрозрачный» UINavigationBar установлено значение «НЕТ», UISearchBar не будет отображаться должным образом, поскольку фон строки состояния остается прозрачным, как вы можете видеть на следующем снимке экрана:

https://www.dropbox.com/s/v5cnxoj9ms6976r/Wrong_behaviour.png?dl=0< /а>

Чтобы продемонстрировать это странное поведение, я изменил образец проекта, предоставленный Apple:

https://developer.apple.com/library/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html

Здесь вы можете скачать модифицированную версию:

https://www.dropbox.com/s/7icfe6kap98g1e8/TableSearchwithUISearchControllerObj-CandSwift_MODIFIED.zip?dl=0

Модификация находится в файле «APLMainTableViewController.m», строка 33.


person selcuksinan    schedule 14.10.2014    source источник
comment
Да, я тоже это вижу. Очень расстраивает.   -  person Kyle Truscott    schedule 24.02.2015
comment
Скриншоты не существуют. Не могли бы вы загрузить их снова?   -  person vahotm    schedule 14.03.2018


Ответы (5)


Это явно ошибка (rdar://20942583).

Мой обходной путь - установить

self.edgesForExtendedLayout = UIRectEdgeAll;
self.extendedLayoutIncludesOpaqueBars = YES;

Это позволяет сделать панель навигации непрозрачной. Недостатком является то, что содержимое перемещается ниже панели, даже если его не видно, что создает некоторые накладные расходы.

person Ortwin Gentz    schedule 13.05.2015
comment
Настройка edgesForExtendedLayout мне не понадобилась. Но это сработало. - person Albert Bori; 04.08.2015
comment
Это сработало и для меня. Я ломал голову над этим последние два дня. Однако для этого потребовались две строки. - person I make my mark; 06.01.2016
comment
эти две строки необходимы для целевого vc? - person Godfather; 24.05.2018
comment
@Godfather нет, на презентации VC. - person Ortwin Gentz; 25.05.2018
comment
ПОЧЕМУ Яблоко ПОЧЕМУ!? Вы украли 3 часа моей жизни этим, я хочу их вернуть! - person PakitoV; 01.10.2018

Все, что мне было нужно, это:

func viewDidLoad() { 

    extendedLayoutIncludesOpaqueBars = true
}
person Jiří Zahálka    schedule 07.07.2015

Одним из обходных путей для этого является сделать строку состояния полупрозрачной непосредственно перед тем, как поиск станет активным, и убрать полупрозрачность, когда поиск станет неактивным< /эм>.

Вы можете сделать это, зарегистрировав контроллер представления в качестве делегата UISearchController и реализовав методы willPresentSearchController и willDismissSearchController. Например (в Swift):

Объявите свой контроллер представления делегатом UISearchController:

 class MyViewController: UITableViewController, UISearchControllerDelegate

Не забудьте установить его в качестве делегата, например, в viewDidLoad добавьте:

    searchController.delegate = self

И наконец:

func willPresentSearchController(searchController: UISearchController) {
    navigationController?.navigationBar.translucent = true
}

func willDismissSearchController(searchController: UISearchController) {
    navigationController?.navigationBar.translucent = false
}
person Luis    schedule 29.04.2015
comment
Это сработало для меня. Почему Apple даже поддерживает изменение barTintColor на панелях навигации? - person Steve Moser; 01.07.2015
comment
Пару дней болела голова. Спасибо чувак, спас мне жизнь. Нужно установить его обратно в false при нажатии нового контроллера представления, а также установить его в searchController.isActive на viewDidAppear. - person George Sabanov; 07.09.2018

Хорошо, это СУПЕР боль для отладки, но не так уж плохо для исправления. Все дело в том, как Apple изменила внешний вид навигационных панелей. Это можно исправить, создав объект UINavigationBarAppearance, настроив его с нужными вам визуальными свойствами (например, цвет фона и т. д.), а затем назначив его standardAppearance и scrollEdgeAppearance на UINavigationBar.appearance() — вы можете иметь два разных экземпляра с разными настройками, если хотите.

Простая реализация может выглядеть так:

let appearance = UINavigationBarAppearance()
appearance.configureWithDefaultBackground()
appearance.backgroundColor = barColor
appearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: textColor]

UINavigationBar.appearance().standardAppearance = appearance
UINavigationBar.appearance().scrollEdgeAppearance = appearance

(Естественно замените barColor и textColor цветами по вашему выбору!)

person Ash    schedule 09.12.2020

если у кого-то есть проблема, например, непрозрачная скрытая панель поиска, у вас может быть это:

self.definesPresentationContext = истина

С уважением

person sgr    schedule 08.08.2016