Référé ici et ici . Pas de réponse dans le premier lien. Dans le deuxième lien, bien que la réponse ne soit pas acceptée, le lien vers le forum des développeurs Apple donne une erreur.
Avant iOS 11:
iOS 11:
Note: Même appareil, même code.
Cela signifie également que toutes les applications utilisant cette fonctionnalité doivent être republiées?
L'ajout de ces lignes l'a corrigé pour moi:
override func viewDidLayoutSubviews() {
self.searchController.searchBar.sizeToFit()
}
Je peux obtenir que l'apparence initiale s'affiche correctement dans iOS11 à l'aide du code suivant (selon la réponse de 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;
}
Toutefois, si l'application est en arrière-plan puis restaurée alors que la barre de recherche était active, l'apparence finirait par se chevaucher, comme indiqué dans la deuxième capture d'écran ci-dessus.
J'ai pu résoudre ce problème avec la solution suivante:
[[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];
}];
(Je travaille toujours sur la manière de résoudre les problèmes de mise en page à la suite d'un changement d'orientation de l'interface lorsque la barre de recherche est active - cela finit toujours par se chevaucher.)
Dans le radar déposé par Ray Wenderlich, @benck a publié cette réponse de WWDC, qui, si je ne me trompe pas, n'a pas encore été publiée.
J'ai rencontré le même problème sur mon application, ma solution est dans iOS 11, en utilisant une nouvelle méthode suggérée par Apple pour searchBar qui est dans navigationItem, sinon, en utilisant l'ancienne méthode. Mon code dans viewDidLoad () comme ci-dessous:
if #available(iOS 11.0, *) {
navigationController?.navigationBar.prefersLargeTitles = false
navigationItem.searchController = searchController
navigationItem.hidesSearchBarWhenScrolling = false
searchViewHeight.constant = 0
} else {
searchView.addSubview(searchController.searchBar)
}
J'ai deux IBOutlets: searchView et searchViewHeight:
@IBOutlet var searchView: UIView!
@IBOutlet var searchViewHeight: NSLayoutConstraint! // new added for iOS 11
Avant iOS 11, la hiérarchie de mon viewController est la suivante:
J'ai un searchView dont la hauteur est de 44 à contient la vue searchBar de mon searchController. C'est sous la barre de navigation.
Dans iOS 11, j'ajoute un nouvel IBOutlet pour la contrainte de hauteur de searchView et lui attribue la valeur 0, masquant cette vue conteneur. Et ajoutez searchController comme élément de navigation.
Voir le document d'Apple: https://developer.Apple.com/documentation/uikit/uinavigationitem/2897305-searchcontroller
Une autre chose est sous iOS 11, la couleur de fond textField du searchBar est un peu plus sombre que la couleur de la barre de navigation par défaut. Par souci de cohérence, vous pouvez le changer en blanc, le code ci-dessous fonctionnera à la fois pour iOS11 et ses versions antérieures:
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
}
}
Selon vos commentaires, votre UISearchController
's UISearchBar
a été affectée à votre UITableView
' s tableHeaderView
. Dans iOS 11, vous devriez plutôt affecter votre UISearchController
à la propriété searchController
de votre vue navigationItem
. Vous n'avez plus besoin d'assigner la UISearchBar
n'importe où. Voir Documentation Apple sur cette nouvelle propriété.
J'ai eu le même problème sous iOS 11.
Contrairement à certains commentaires, si je regarde vos captures d'écran, vous NE DEVEZ PAS le définir en tant que navigationItem
car vous n'avez pas de configuration UINavigationController
.
Vous ne voulez pas non plus ajouter la searchBar
dans l'en-tête de la tableView
car, pour une raison quelconque, il ne peut pas gérer la scopeBar
Donc ce que j'ai fait pour le réparer:
Pour obtenir une UISearchBar
avec des étendues sur votre tableView
, utilisez une UIViewController
dans le générateur d'interface pas une UITableViewController
.
Placez une UISearchBar
et une UITableView
dans le contrôleur de vue et connectez-les correctement (délégués, source de données, etc.).
N'oubliez pas de modifier également votre fichier Swift en UIViewController
au lieu de UITableViewController
et de le modifier en conséquence. (ajoutez une propriété tableView et connectez-la via IBOutlet
, modifiez les délégués pour la tableView, etc.)
Ensuite, dans le générateur d’interface, utilisez les guides autoLayout pour que searchBar
soit placé au-dessus de tableView
.
Dans l'interface Builder, lorsque vous activez la barre d'étendue, cela aura l'air totalement bizarre, mais ne paniquez pas, tout ira bien. Je suppose que Apple a vissé le constructeur d'interface de rendu n quand ils ont changé le comportement pour fonctionner avec UINavigationController
... de toute façon ...
Ensuite, tout fonctionne comme il se doit et ressemble à ceci (dans mon cas, je présente le vc dans un popover mais peu importe)
Je pense que la solution consiste à ajouter la barre de recherche dans la barre de navigation:
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
Vous trouverez un exemple pour UISearchBarController - SearchBar et les boutons de portée se chevauchent ici .