См. Здесь и здесь. Нет ответа в первой ссылке. Во второй ссылке, хотя ответ не принят, но ссылка на форум разработчиков 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]()