Проблема UISearchBarController iOS 11 - перекрытие кнопок SearchBar и области видимости

См. Здесь и здесь. Нет ответа в первой ссылке. Во второй ссылке, хотя ответ не принят, но ссылка на форум разработчиков Apple дает ошибку.

Перед iOS 11:

enter image description here

iOS 11:

enter image description here

Примечание. Тот же самый код устройства.
Кроме того, это означает, что все приложения, использующие эту функцию, должны быть переизданы?

Ответ 1

Добавление этих строк исправило это для меня:

override func viewDidLayoutSubviews() {
    self.searchController.searchBar.sizeToFit()
}

Ответ 2

В радаре, который подал Рэй Вендерлих, @benck опубликовал этот ответ от WWDC, который, если я не ошибаюсь, еще не опубликован.

Ответ 3

По вашим комментариям ваш UISearchController UISearchBar был назначен вашему UITableView tableHeaderView. В iOS 11 вместо этого вы должны назначить свой UISearchController searchController вашего свойства navigationItem. Вам больше не нужно назначать UISearchBar где угодно. См. Документацию Apple по этому новому свойству.

Ответ 4

Я столкнулся с той же проблемой в своем приложении, мое решение находится в iOS 11, используя Apple, предложив новый способ для SearchBar, который находится в navigationItem, иначе, используя старый способ. Мой код в viewDidLoad(), как показано ниже:

if #available(iOS 11.0, *) {
    navigationController?.navigationBar.prefersLargeTitles = false
    navigationItem.searchController = searchController
    navigationItem.hidesSearchBarWhenScrolling = false
    searchViewHeight.constant = 0
} else {
    searchView.addSubview(searchController.searchBar)
}

У меня есть два IBOutlets: searchView и searchViewHeight:

@IBOutlet var searchView: UIView!
@IBOutlet var searchViewHeight: NSLayoutConstraint! // new added for iOS 11

Перед iOS 11 моя иерархия viewController, как показано ниже:

My searchView before iOS 11

У меня есть searchView, высота которого составляет 44, содержит мой поиск SearchCarroller searchBar. Он находится под навигационной панелью.

В iOS 11 я добавляю новый IBOutlet для ограничения высоты поиска SearchView и устанавливаю его константу в 0, скрывая это представление контейнера. И добавьте searchController как часть элемента навигации.

См. Документ apple: https://developer.apple.com/documentation/uikit/uinavigationitem/2897305-searchcontroller

Еще одна вещь относится к iOS 11, цвет фона backgroundField для searchBar немного темнее, чем цвет панели навигации. Для согласованности вы можете изменить его на белый, ниже код будет работать как для iOS11, так и для предыдущего:

if let textField = searchController.searchBar.value(forKey: "searchField") as? UITextField {
    if let backgroundView = textField.subviews.first {

        // Search bar textField background color
        backgroundView.backgroundColor = UIColor.white

        // Search bar textField rounded corner
        backgroundView.layer.cornerRadius = 10
        backgroundView.clipsToBounds = true
    }
}

Ответ 5

Я могу получить исходный вид, чтобы правильно отображаться в iOS11, используя следующий код (согласно greg-ответу):

[self.searchController.searchBar sizeToFit];

if (@available(iOS 11.0, *)) {
    self.navigationItem.searchController = self.searchController;
    self.navigationItem.hidesSearchBarWhenScrolling = NO;
} else {
    // Fallback on earlier versions
    self.tableView.tableHeaderView = self.searchController.searchBar;
}

Тем не менее, если приложение затенено, а затем восстановлено, когда панель поиска активна, внешний вид будет перекрываться, как показано на втором скриншоте Nitish выше.

Я смог исправить это с помощью следующего обходного пути:

[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
    self.searchController.searchBar.showsScopeBar = NO;
    [self.searchController.searchBar sizeToFit];
    self.searchController.searchBar.showsScopeBar = YES;
    [self.searchController.searchBar sizeToFit];
}];

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

Ответ 6

Я думаю, что решение состоит в том, чтобы добавить панель поиска в панель навигации:

navigationController?.navigationBar.prefersLargeTitles = true // Navigation bar large titles
navigationItem.title = "Contacts"
navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.white]
navigationController?.navigationBar.barTintColor = UIColor(displayP3Red: 0/255, green: 150/255, blue: 136/255, alpha: 1.0)

let searchController = UISearchController(searchResultsController: nil) // Search Controller
navigationItem.hidesSearchBarWhenScrolling = false
navigationItem.searchController = searchController

Вы можете найти пример для UISearchBarController - SearchBar и кнопки области перекрытия здесь.

Ответ 7

У меня была такая же проблема в iOS 11.

В отличие от некоторых комментариев здесь, если я посмотрю ваши скриншоты, вы НЕ ДОЛЖНЫ указывать его как navigationItem потому что у вас нет настройки UINavigationController.

Вы также не хотите добавлять searchBar в заголовок tableView потому что по какой-то причине он не может справиться с scopeBar

Так что я сделал, чтобы исправить это:

Чтобы получить UISearchBar с областями над вашим tableView, используйте UIViewController в построителе интерфейса, а не UITableViewController.

Поместите UISearchBar и UITableView внутри контроллера представления и правильно подключите их (делегаты, dataSource и т.д.).

Не забудьте также изменить ваш быстрый файл на UIViewController вместо UITableViewController и соответствующим образом изменить его. (добавьте свойство tableView и подключите его через IBOutlet, измените делегаты для tableView и т.д.).

Затем в построителе интерфейсов используйте направляющие autoLayout, чтобы searchBar поверх tableView

enter image description here

В построителе интерфейса, когда вы активируете панель видимости, это будет выглядеть совершенно странно, но не паникуйте, все будет хорошо. Я предполагаю, что Apple прикрутил конструктор интерфейса рендеринга n, когда они изменили поведение для работы с UINavigationController... в любом случае...

Затем все работает так, как должно и выглядит так (в моем случае я представляю его vc в popover, но это не имеет значения)

enter image description here