J'ai un UISearchController
avec un UITableViewController
en tant que searchResultsController
, le UISearchBar
de ce searchController
est défini dans le tableHeaderView
de mon tableView
affiché dans ma racine ViewController. Presque tout fonctionne bien, comme prévu. Mais dans l'animation de UISearchBar
(quand je clique sur le searchBar et que le UINavigationBar
se cache et que le searchBar se place en haut, comme dans le UISearchDisplayController
), j'ai un comportement étrange. Au lieu de passer à la position de UINavigationBar
(y: 0), il sort de l'écran et lance l'animation qui affiche le bouton d'annulation. J'ai essayé de déplacer mon code d'instanciation vers le viewDidLoad
au lieu de init
, et les choses sont exactement les mêmes. Je pense que le centre du problème est dans le cadre de la vue de searchResultsController
, mais je ne suis pas sûr à ce sujet (j'ai essayé de définir le cadre, sans succès). Tout ce que je fais est en code pur.
Voici la partie pertinente du code:
- (void) viewDidLoad {
[super viewDidLoad];
// search controller setup
self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchResultsController];
self.searchController.delegate = self;
self.searchController.searchResultsUpdater = self;
self.searchController.searchBar.delegate = self;
[self.searchController.searchBar sizeToFit];
self.tableView.tableHeaderView = self.searchController.searchBar;
self.searchController.definesPresentationContext = YES;
}
Et j'ai une charge paresseuse pour le searchResultsController
:
- (UITableViewController *)searchResultsController {
if (_searchResultsController == nil) {
_searchResultsController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
_searchResultsController.tableView.delegate = self;
_searchResultsController.tableView.dataSource = self;
}
return _searchResultsController;
}
J'ai téléchargé l'exemple de code d'Apple, mais ils utilisent StoryBoards et un xib pour UITableViewCell, le SearchController fonctionne parfaitement dans le projet. Est-ce que quelqu'un a eu le même problème? Comment puis-je réparer cela? Toute solution ou suggestion serait appréciée.
Merci pour l'attention.
Ajouter
self.extendedLayoutIncludesOpaqueBars = YES;
sur la méthode viewDidLoad
Avez-vous essayé de définir false sur hidesNavigationBarDuringPresentation? J'ai résolu mon mal de tête ..
self.searchController.hidesNavigationBarDuringPresentation = false;
Mettre la barre de recherche dans la barre de navigation donne une expérience utilisateur plus solide à mon avis (pour iphone)
self.navigationItem.titleView = self.searchController.searchBar;
Pour clarifier cela @, la réponse de Lorenzo a fonctionné pour moi.
self.definesPresentationContext = YES;
Essayez ceci:
Vous devez d’abord déléguer le
UISearchControllerDelegate
Pour Swift
func willPresentSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.translucent = true
}
func willDismissSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.translucent = false
}
Dans Swift, essayez:
override func viewDidLoad() {
edgesForExtendedLayout = []
searchController.hidesNavigationBarDuringPresentation = false
// ...
}
Swift 3.01
func willPresentSearchController(searchController: UISearchController){
self.navigationController?.navigationBar.isTranslucent = true
}
func willDismissSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.isTranslucent = false
}
Dans mon cas, le searchBar se trouvait dans la tableHeaderView et il n'y avait pas de NavigationBar à l'écran. Mais la barre de recherche est toujours animée et recouvre la barre d’état lorsqu’elle devient active. La solution pour éviter cela était de définir:
searchController.hidesNavigationBarDuringPresentation = false
Ce qui est bizarre parce que, comme je l'ai dit, le contrôleur de vue n'utilisait pas de barre de navigation.
J'ai remarqué que UISearchController fonctionne parfaitement dans l'une de mes vues mais pas dans l'autre. Le problème était lié à UITableViewController et non à UIViewController. Si vous passez à un UIViewController avec un UITableView à l'intérieur et s'il est correctement contraint, aucun problème ne survient. J'ai implémenté le mien avec un XIB et cela a fonctionné parfaitement.