J'attache un UISearchController
au navigationItem.searchController
sur iOS 13. Cela fonctionne bien: je peux utiliser la belle barre de recherche de style iOS 13.
Cependant, j'aimerais voir les grands titres et la barre de recherche par défaut.
J'ai défini navigationItem.hidesSearchBarWhenScrolling = false
Parce que je veux voir la recherche de manière permanente sur mon écran, mais la barre de recherche remplace les grands titres par défaut.
Est-ce que quelqu'un sait comment c'est possible?
navigationItem.searchController = UISearchController(searchResultsController: nil)
navigationItem.hidesSearchBarWhenScrolling = false
C'est ainsi que j'ai besoin d'implémenter (le titre grand titre et la barre de recherche visible)
Pour moi, cela a fonctionné après avoir ajouté les lignes suivantes dans la méthode ViewDidLoad ():
searchController.hidesNavigationBarDuringPresentation = true navigationController?.navigationBar.prefersLargeTitles = true navigationController!.navigationBar.sizeToFit()
D'accord, j'ai essayé de réaliser la même chose toute la journée pour que mon application soit aussi bien et que je l'ai enfin fait.
Je voulais ajouter une barre de recherche dans une entreprise UitailViewController et je l'ai fait de cette façon.
let searchController: UISearchController = {
let searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.placeholder = "New Search"
searchController.searchBar.searchBarStyle = .minimal
searchController.dimsBackgroundDuringPresentation = false
searchController.definesPresentationContext = true
return searchController
}()
Vous créez d'abord une nouvelle UisearchController à l'aide d'une fermeture, de cette façon, vous êtes capable de l'utiliser dans le monde entier dans votre code et de le personnaliser plus facilement à l'avenir.
Ensuite, dans la vue ViewDidLoad, vous définissez le searchSontroller.searchResultsUpdater = self
et le navigationItem.searchController = searchController
.
Pour moi, cela fonctionne parfaitement après beaucoup d'essais et d'erreurs depuis que je fais tout tout par programme.
Essayez ceci, fonctionnant bien de mon côté
private var search = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
search.searchBar.delegate = self
search.searchBar.sizeToFit()
search.obscuresBackgroundDuringPresentation = false
search.hidesNavigationBarDuringPresentation = true
self.definesPresentationContext = true
search.searchBar.placeholder = "Search here"
self.navigationItem.searchController = search
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationItem.hidesSearchBarWhenScrolling = false
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationItem.hidesSearchBarWhenScrolling = true
}
Pour une grande barre de navigation, utilisez cette
Pour la prise en charge complète de la barre de navigation de l'application, veuillez ajouter cette extension à l'intérieur de votre code.
import UIKit
extension UIViewController {
open func showNavigationBar(_ large: Bool,
_ animated: Bool,
titleColor: UIColor,
barTintColor: UIColor,
fontSize: CGFloat) {
navigationController?.navigationBar.barTintColor = barTintColor
navigationController?.navigationBar.backgroundColor = barTintColor
navigationController?.navigationBar.isTranslucent = true
self.navigationController?.setNavigationBarHidden(false, animated: animated)
if large {
self.navigationController?.navigationBar.prefersLargeTitles = true
if #available(iOS 13.0, *) {
let appearance = UINavigationBarAppearance()
appearance.backgroundColor = barTintColor
appearance.titleTextAttributes = [.foregroundColor: titleColor]
appearance.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: titleColor,
NSAttributedString.Key.font: UIFont(resource: R.font.robotoMedium, size: fontSize)!]
navigationController?.navigationBar.standardAppearance = appearance
navigationController?.navigationBar.compactAppearance = appearance
navigationController?.navigationBar.scrollEdgeAppearance = appearance
} else {
self.navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: titleColor,
NSAttributedString.Key.font: UIFont(resource: R.font.robotoMedium, size: fontSize)!]
}
} else {
self.navigationController?.navigationBar.prefersLargeTitles = false
self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: titleColor,
NSAttributedString.Key.font: UIFont(resource: R.font.robotoMedium, size: 20.0)!]
}
}
}
Puis appelez cette méthode simplement
self.showNavigationBar(true, true, titleColor: UIColor.blue, barTintColor: UIColor.red, fontSize: 32.0)
Si alors ne fonctionne pas non plus, utilisez ceci
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
search.searchBar.becomeFirstResponder()
}
Une solution de plus est que l'ajout d'un uIView avec une hauteur 0 en storyboard et une touche de sécurité avec une zone de sécurité et un bas avec UiscrollView/Uicollectionview/utableview ou quelque chose d'autre vue défilable et supprimez la contrainte directe entre TOPSAREAEA et ScrollableView Haut. Je sais que ce n'est peut-être pas une solution mais j'ai fait dans un storyboard.