IOS 9 searchBar исчезает из представления заголовка таблицы, когда активен UISearchController

Структура:

View1 (нажмите кнопку) → присутствует модально (MyModalView: UITableViewController)

В MyModalView встроен UISearchController. SearchBar UISearchController помещается в MyModalView.tableView.tableHeaderView.

Он отлично работает с iOS 8.0. Однако на iOS 9, SearchBar исчезает, когда UISearchController активен. Пожалуйста, взгляните на фотографии тезисов ниже

Модальный вид: модальный вид

UISearchController активен в iOS 8: строка поиска в iOS 8

UISearchController активен в iOS 9: строка поиска в iOS 9

Самый стандартный код:

override func viewDidLoad() {
    super.viewDidLoad()

    // Dynamically create a search controller using anonymous function
    self.resultSearchController = ({
        let controller = UISearchController(searchResultsController: nil)
        controller.searchResultsUpdater = self
        controller.dimsBackgroundDuringPresentation = false

        controller.searchBar.sizeToFit()
        controller.searchBar.delegate = self

        self.tableView.tableHeaderView = controller.searchBar

        return controller
    })()

    // Auto sizing row & cell height
    self.tableView.estimatedRowHeight = 130
    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.definesPresentationContext = true

    // No footer for better presentation
    self.tableView.tableFooterView = UIView.init(frame: CGRectZero)
}

Эта проблема также возникает в бета-версии iOS 9.1...

Любая идея/указатель будет глубоко оценена

Приветствия.

Ответ 1

Кажется, у всех нас была та же проблема, но они были решены по-разному. Однако ни один из предложенных ответов не помог мне:( Тем не менее, спасибо вам всем за ваше время.

У меня есть решение, которое решило мою проблему. Он устанавливает Extend Edges - под непрозрачными барами моего (MyModalView: UITableViewController) до true в раскадровке с помощью Interface Builder.

Вкратце:

MyModalView: UITableViewController, в Storyboard с помощью Interface Builder имеет

Расширить края: - Под верхними барами тикают - Под нижними барами тикают - Под Opaque Bars отмечен

screenshot

Ответ 2

Я не уверен, в чем проблема, но я "исправил" ее:

self.searchController.hidesNavigationBarDuringPresentation = NO;
self.definesPresentationContext = NO;

Я предполагаю, что UISearchController делает что-то напуганное, когда пытается представить его как панель навигации. Итак, это взлом, но он по крайней мере не блокирует пользователя. Панель поиска не делает крутую анимацию и закрывает панель навигации.

Ответ 3

Я нашел в симуляции метрики (верхний бар) в раскадровке, которые вызывают эту проблему. В моем случае работают следующие строки, но я до сих пор не знаю почему.

- (void)willPresentSearchController:(UISearchController *)searchController {
    // do something before the search controller is presented
    self.navigationController.navigationBar.translucent = YES;
}

-(void)willDismissSearchController:(UISearchController *)searchController
{
    self.navigationController.navigationBar.translucent = NO;
}

Ответ 4

Мне пришлось

self.aNavigationController?.extendedLayoutIncludesOpaqueBars = true

Я нашел аналогичный вопрос здесь, но в моем случае это не было в методе viewDidLoad. Мне пришлось попробовать разные взгляды, пока они не сработали. Теперь у меня есть как пользовательский цвет панели навигации, так и панель поиска,

Ответ 5

Спасибо @wiles duan и @Techprimate

В моем случае я исправил эту проблему, установив:

self.definesPresentationContext = NO;

И реализуем следующие 2 метода в UISearchControllerDelegate

- (void)willPresentSearchController:(UISearchController *)searchController {
    // do something before the search controller is presented
    self.navigationController.navigationBar.translucent = YES;
}

-(void)willDismissSearchController:(UISearchController *)searchController
{
    self.navigationController.navigationBar.translucent = NO;
}

Ответ 6

Я исправил его в моем случае, удалив

definesPresentationContext = true

Я еще не тестировал, если есть какие-то недостатки в устранении этого!

Ответ 7

У меня нет панели навигации в этом месте приложения. Ни одна из других сообщений SO не помогла мне, поэтому я исправил ее так:

- (void)layoutSubviews
{
    [[[self searchController] searchBar] sizeToFit];
}

Ответ 8

Настройка навигационной панели навсегда для полупрозрачного в раскадровке решила мою проблему.

Ответ 9

Работает

override func viewDidLoad() {
    super.viewDidLoad()

    self.extendedLayoutIncludesOpaqueBars = !self.navigationController!.navigationBar.translucent
}

Ответ 10

У меня была та же проблема, и когда я отлаживал пользовательский интерфейс на Xcode, я обнаружил, что представление UISearchBar было перемещено в другое представление, а ширина была обнулена.

Я установил его, установив definesPresentationContext свойство UISearchController в false и установив его true для содержащего UITableViewController.

Я добавил только одну строку в ваш viewDidLoad().

override func viewDidLoad() {
    super.viewDidLoad()

    // Dynamically create a search controller using anonymous function
    self.resultSearchController = ({
        let controller = UISearchController(searchResultsController: nil)
        controller.searchResultsUpdater = self
        controller.dimsBackgroundDuringPresentation = false
        controller.definesPresentationContext = false    // Disable the presentation controller

        controller.searchBar.sizeToFit()
        controller.searchBar.delegate = self

        self.tableView.tableHeaderView = controller.searchBar

        return controller
    })()

    // Auto sizing row & cell height
    self.tableView.estimatedRowHeight = 130
    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.definesPresentationContext = true    // This one remains the same

    // No footer for better presentation
    self.tableView.tableFooterView = UIView.init(frame: CGRectZero)
}

Ответ 11

Если вы хотите скрыть свою навигационную панель и отобразить полный экран контроллера поиска, установите на панели навигации следующее: панель поиска не будет раскалываться:

navigationController?.navigationBar.translucent = true