UISearchController работает некорректно с непрозрачным UINavigationBar

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

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

Но если для свойства "полупрозрачного" UINavigationBar установлено значение "NO", 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.

Ответы

Ответ 1

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

Мое обходное решение - установить

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

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

Ответ 2

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

func viewDidLoad() { 

    extendedLayoutIncludesOpaqueBars = true
}

Ответ 3

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

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

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

 class MyViewController: UITableViewController, UISearchControllerDelegate

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

    searchController.delegate = self

И наконец:

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

func willDismissSearchController(searchController: UISearchController) {
    navigationController?.navigationBar.translucent = false
}

Ответ 4

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

self.definesPresentationContext = true

Привет