La structure:
View1 (cliquez sur un bouton) -> présent modalement (MyModalView: UITableViewController)
MyModalView a UISearchController intégré. La barre de recherche de UISearchController est placée dans MyModalView.tableView.tableHeaderView.
Cela fonctionne bien depuis iOS 8.0. Toutefois, sur iOS 9, la barre de recherche disparaît lorsque UISearchController est actif. S'il vous plaît jeter un oeil à ces images ci-dessous
UISearchController actif sur iOS 8:
UISearchController actif sur iOS 9:
Le code très standard:
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)
}
Ce problème se produit également dans iOS 9.1 beta ...
Toute idée/pointeur serait profondément apprécié
À votre santé.
Il semble que nous ayons tous le même problème, mais ils ont été résolus de différentes manières. Cependant, aucune des réponses suggérées n'a fonctionné pour moi :(. Néanmoins, merci à tous pour votre temps.
J'ai une solution qui a résolu mon problème. Définissez Extend Edges - Sous les barres opaques de my (MyModalView: UITableViewController) sur true dans le storyboard à l'aide d'Interface Builder.
En résumé:
MyModalView: UITableViewController, dans Storyboard à l'aide d'Interface Builder a
Étendre les bords: - Sous les barres supérieures cochées - Sous les barres inférieures cochées - Sous les barres opaques cochées
Je ne sais pas quel est exactement le problème, mais je l'ai 'résolu' par:
self.searchController.hidesNavigationBarDuringPresentation = NO;
self.definesPresentationContext = NO;
Je suppose que UISearchController
fait quelque chose de génial quand il essaie de se présenter comme une barre de navigation. Donc, c'est un hack, mais au moins cela ne bloque pas l'utilisateur. La barre de recherche ne fait pas l'animation cool et couvre la barre de navigation.
J'ai trouvé que ce sont les mesures simulées (barre du haut) du storyboard qui sont à l'origine de ce problème . Dans mon cas, les lignes suivantes fonctionnent, mais je ne sais toujours pas pourquoi.
- (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;
}
J'ai dû
self.aNavigationController?.extendedLayoutIncludesOpaqueBars = true
J'ai trouvé une question similaire ici mais dans mon cas, ce n'était pas sur la méthode viewDidLoad. J'ai dû essayer différentes vues jusqu'à ce que cela fonctionne. Maintenant, je peux avoir à la fois une couleur de barre de navigation personnalisée et la barre de recherche,
Merci @wiles duan et @Techprimate
Dans mon cas, j'ai résolu ce problème en réglant:
self.definesPresentationContext = NO;
Et implémentez les 2 méthodes suivantes dans 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;
}
Je l'ai corrigé dans mon cas en retirant
definesPresentationContext = true
Je n'ai pas encore testé s'il y avait des inconvénients à le supprimer!
J'ai eu le même problème et lorsque j'ai débogué l'interface utilisateur sur Xcode, j'ai constaté que la vue UISearchBar
avait été déplacée vers une autre vue et que la largeur était mise à zéro.
Je l'ai corrigé en définissant la propriété definesPresentationContext
de UISearchController
sur false
et en la fixant true
pour la UITableViewController
contenant.
J'ai ajouté une seule ligne à votre 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)
}
Je n'ai pas de barre de navigation à la place d'une application. Aucun autre message SO ne m'a aidé, donc je l'ai corrigé de cette façon:
- (void)layoutSubviews
{
[[[self searchController] searchBar] sizeToFit];
}
Régler la barre de navigation de façon permanente sur translucide dans le storyboard a résolu mon problème.
Ça marche
override func viewDidLoad() {
super.viewDidLoad()
self.extendedLayoutIncludesOpaqueBars = !self.navigationController!.navigationBar.translucent
}
sc.hidesNavigationBarDuringPresentation = false
fait le tour pour moi
lazy var searchController:UISearchController = {
let sc = UISearchController(searchResultsController: nil)
sc.searchResultsUpdater = self
sc.obscuresBackgroundDuringPresentation = false
sc.searchBar.placeholder = "Search"
sc.hidesNavigationBarDuringPresentation = false
return sc
}()
Si vous souhaitez masquer votre barre de navigation et présenter le contrôleur de recherche en plein écran, définissez les éléments suivants sur votre barre de navigation et la barre de recherche ne dissappera pas:
navigationController?.navigationBar.translucent = true
Aucun d'entre eux n'a fonctionné pour moi, je l'ai corrigé en utilisant ce hack
func position(for bar: UIBarPositioning) -> UIBarPosition {
if UIDevice.current.userInterfaceIdiom == .pad {
return .top
} else {
if iOSVersion <= 9 {
return .top
}
return .topAttached
}
}