Je fais UISearchBar
partie de la barre de navigation comme:
let searchBar = UISearchBar()
//some more configuration to the search bar
.....
navigationItem.titleView = searchBar
Après la mise à jour vers iOS 11
quelque chose de bizarre est arrivé à la barre de recherche de mon application. Sur iOS 10
et avant, ma barre de navigation ressemblait à:
Maintenant avec iOS 11
j'ai:
Comme vous pouvez le voir, il y a une différence dans l'arrondi des deux barres de recherche qui ne me dérange pas. Le problème est que la barre de recherche augmente la hauteur de la barre de navigation. Donc, quand je vais sur un autre contrôleur, ça a l'air bizarre aussi:
En fait, la hauteur de la ligne noire bizarre plus la hauteur de la barre de navigation actuelle est égale à la hauteur de la barre de navigation indiquée dans la deuxième image ...
Des idées sur la façon de se débarrasser de la ligne noire et d'avoir une hauteur de barre de navigation cohérente sur tous les contrôleurs de vue?
la source
Réponses:
J'ai une ligne noire sous NavigationBar avec SearchBar dans iOS 11 dans deux cas:
quand j'ai poussé un autre ViewControllers de ViewController avec UISearchBar
quand j'ai fermé ViewController avec UISearchBar avec "glisser vers la droite pour ignorer"
Ma solution était: ajouter ce code à mon ViewController avec UISearchBar:
Mise à jour Swift 4
la source
Vous pouvez ajouter une contrainte de hauteur 44 à la barre de recherche pour iOS 11.
// Rapide
// Objectif c
la source
Je crois que dans iOS 11 UISearchBar a maintenant la hauteur égale à 56, et UINavigationBar utilise la mise en page automatique pour s'adapter à ses sous-vues, ce qui augmente la hauteur. Si vous souhaitez toujours avoir UISearchBar comme titleView comme dans la version antérieure à iOS 11, j'ai découvert que la meilleure façon de le faire est d'intégrer UISearchBar dans une vue personnalisée, de définir la hauteur de cette vue sur 44 et de l'attribuer à navigationItem.titleView
la source
essayez ce code sur le contrôleur de vue "ACKNOWLEDGMENTS" dans viewDidLoad
la source
extendedLayoutIncludesOpaqueBars
propriété.Merci à tous! J'ai finalement trouvé une solution.
Ajout du code suivant à ViewController avec UISearchBar.
viewDidLoad
viewWillDisappear
la source
En Objective-C
la source
Cela m'arrive aussi, tout fonctionne bien dans iOS 12.4 et devient bizarre dans 13 ci-dessus. Le problème réside dans l'augmentation de la hauteur de la barre de navigation iOS 13 de 88 à 100 après le saut de UIViewController qui implémente searchBar.
Essayez ceci dans votre UIViewController qui implémente searchBar.
Aperçu après correction:
Aperçu avant de réparer:
la source
EDIT: La réponse @zgjie est une meilleure solution pour ce problème: https://stackoverflow.com/a/46356265/1713123
Cela semble se produire car dans iOS 11, la valeur de hauteur par défaut de SearchBar a été modifiée à 56, au lieu de 44 sur les versions iOS précédentes.
Pour l'instant, j'ai appliqué cette solution de contournement en définissant la hauteur de searchBar sur 44:
Une autre solution pourrait être d'utiliser la nouvelle propriété searchController sur navigationItem dans iOS 11 :
Mais de cette façon, la barre de recherche apparaît sous le titre de navigation.
la source
CGRect().insetBy(dx:dy:)
etCGRect().offsetBy(dx:dy:)
, dans ce cas -searchController.searchBar.frame = searchController.searchBar.frame.insetBy(dx: 0, dy: -12)
Toutes les solutions ne fonctionnaient pas pour moi, alors avant de pousser le contrôleur de vue, je l'ai fait:
Et pour rendre la barre de recherche présente lors du retour:
la source
Je ne pouvais pas utiliser la solution de garder la barre de navigation à 44. Cela m'a donc pris une journée mais finalement, j'ai trouvé une solution qui ne change pas la hauteur de la barre et positionne le bouton au milieu de la barre. Le problème est que les boutons sont placés dans une vue de pile qui est configurée comme vue de pile horizontale et ne s'ajuste donc pas au changement de hauteur.
Ceci est fait sur init:
on viewWillApear (ou à tout moment après l'ajout de la vue à la pile de navigation)
Et subviewOfClass est une catégorie sur UIView:
la source
Tout ce que vous avez à faire est de sous-classer UISearchBar et de remplacer "intrinsicContentSize":
la source
Impossible de commenter, mais je voulais partager quelques problèmes supplémentaires que j'ai rencontrés en passant de nombreuses heures à essayer d'aller au fond de ce problème, même après avoir utilisé l'une des autres solutions.
Il semble que la meilleure solution pour moi était la réponse d'Andrew :
Cependant, au moins dans iOS 12.1 , si votre
UINavigationBar
:isTranslucent
mis àfalse
, le contrôleur de vue avec la barre de recherche ne semble pas avoir la disposition de sa vue ajustée lors du rejet interactif (le rejet normal via le bouton de retour semble fonctionner).setBackgroundImage(UIImage(), for: .default)
, l'animation de transition ne fonctionne pas correctement et reviendra à sa position après avoir terminé.Cependant, ces propriétés particulières ont été définies pour que la barre de navigation apparaisse d'une certaine manière, donc je dois faire quelques ajustements pour la récupérer, ou supporter le comportement étrange. Je vais essayer de me rappeler de mettre à jour ce qui précède si je rencontre autre chose ou si je trouve d'autres solutions ou différences dans d'autres versions du système d'exploitation.
la source
Dans mon cas, la plus grande hauteur de UINavigationBar n'était pas un problème pour moi. J'avais juste besoin de réaligner les éléments des boutons de la barre gauche et droite. C'est la solution que j'ai trouvée:
Fondamentalement, nous recherchons des vues de pile contenant des éléments de bouton de barre, puis nous modifions les valeurs de leurs contraintes supérieures et inférieures. Oui, c'est un hack de saleté, et je ne recommanderai pas de l'utiliser si vous pouvez résoudre votre problème d'une autre manière.
la source
la source
J'ai trouvé que la solution de Mai Mai était la seule qui soit vraiment utilisable.
Cependant, ce n'est toujours pas parfait:
lors de la rotation de l'appareil, la barre de recherche n'est pas correctement redimensionnée et reste dans la plus petite dimension.
J'ai trouvé une solution pour cela. Voici mon code en Objective C avec les parties pertinentes annotées:
Maintenant, il reste encore un cas que je n'ai pas encore compris. Pour reproduire, procédez comme suit:
- démarrer en portrait
- activer le champ de recherche
- faire pivoter en paysage
- erreur: la barre ne se redimensionne pas
la source
J'ai corrigé cela en ajoutant la contrainte à viewDidAppear sur le contrôleur de vue de la carte où la barre de recherche est intégrée
la source
Salut aux personnes qui l'utilisent
UISearchController
et l'attachent ensuiteUISearchBar
aunavigationItem.titleView
. J'ai passé 4 à 5 heures de ma journée pour résoudre ce problème. Suivre l'approche recommandée d'iOS 11+, qui consiste à mettre lesearchController
à lanavigation.searchController
n'est pas juste pour mon cas. L'écran qui a ce searchController / searchBar a un backButton, un personnalisé.J'ai testé cela dans iOS 10, iOS 11 et 12. Sur différents appareils. Je devais juste le faire. Je ne peux pas rentrer chez moi sans résoudre ce démon. C'est le plus parfait que je puisse faire pour aujourd'hui, compte tenu de mon délai serré.
Donc je veux juste partager ce dur travail que j'ai fait, c'est à vous de tout mettre où vous voulez (ex. Variables dans votre viewModel). Et voilà:
Dans mon premier écran (disons l'écran d'accueil, qui n'a pas ce contrôleur de recherche), j'ai ceci dans mon
viewDidLoad()
.Dans mon deuxième écran, celui qui a le searchController, j'ai ceci dans mon
viewDidAppear
.override func viewDidAppear (_ animated: Bool) {super.viewDidAppear (animé)
et voici ma déclaration de searchController:
J'espère donc que cela aidera quelqu'un un jour.
la source
J'ai essayé diverses choses pour ramener la taille à l'original 44, mais la barre de recherche a toujours l'air et se comporte toujours bizarrement - comme être trop étirée, décalée en Y et autres.
J'ai trouvé une bonne solution ici (via un autre article de stackoverflow): https://github.com/DreamTravelingLight/searchBarDemo
Dérivez simplement votre viewcontroller du SearchViewController et incluez dans votre projet les classes SearchViewController et WMSearchbar. A travaillé hors de la boîte pour moi sans aucun laid si (iOS11) sinon ... laideur.
la source
Dans mon cas, je dois diminuer la hauteur du textField 36pt -> 28pt.
J'ai donc essayé de changer la hauteur du cadre, la hauteur du calque. Mais les moyens n'ont pas fonctionné.
Enfin, j'ai trouvé une solution qui est le masque. Je pense que ce n'est pas un bon moyen, mais cela fonctionne.
Vous pouvez changer les inserts, si vous voulez changer le cadre du textField.
la source