Ik koppel een UISearchController aan de eigenschap navigationItem.searchController
van een UITableViewController op iOS 11. Dit werkt prima: ik kan de mooie zoekbalk in iOS 11-stijl gebruiken.
Ik wil de zoekbalk echter bij het opstarten zichtbaar maken. Standaard moet de gebruiker omhoog scrollen in de tabelweergave om de zoekbalk te zien. Weet iemand hoe dit mogelijk is?
Links: standaardsituatie na lancering. Rechts: zoekbalk zichtbaar gemaakt (door naar boven te scrollen). Ik wil graag dat de zoekbalk zichtbaar is na de lancering, zoals in de rechter screenshot.
Ik heb al ontdekt dat de zoekbalk zichtbaar kan worden gemaakt door de eigenschap hidesSearchBarWhenScrolling
van mijn navigatie-item in te stellen op false. Dit zorgt er echter voor dat de zoekbalk altijd zichtbaar is, zelfs als ik naar beneden scrol, wat niet is wat ik wil.
Antwoord 1, autoriteit 100%
Het volgende maakt de zoekbalk eerst zichtbaar en laat hem vervolgens verbergen tijdens het scrollen:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if #available(iOS 11.0, *) {
navigationItem.hidesSearchBarWhenScrolling = false
}
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if #available(iOS 11.0, *) {
navigationItem.hidesSearchBarWhenScrolling = true
}
}
Het gebruik van isActive
deed niet wat ik wilde, het maakt de zoekbalk actief (laat de annuleerknop zien, enz.), terwijl ik alleen maar wil dat het zichtbaar is.
Antwoord 2, autoriteit 3%
Je kunt de eigenschap isActive
instellen op true
nadat je de searchController hebt toegevoegd aan het navigationItem
.
Zo:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
searchController.isActive = true
}
Antwoord 3, autoriteit 2%
Voor mij werkte het na het toevoegen van de volgende regels in de viewDidLoad()
methode:
navigationController?.navigationBar.prefersLargeTitles = true
navigationController!.navigationBar.sizeToFit()
Antwoord 4, autoriteit 2%
Op iOS 13 werkte het antwoord van @Jordan Wood niet.
In plaats daarvan deed ik:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
UIView.performWithoutAnimation {
searchController.isActive = true
searchController.isActive = false
}
}
Antwoord 5
For (iOS 13.0, *) and SwiftUI
navigationController?.navigationBar.sizeToFit()
Example:
struct SearchBarModifier: ViewModifier {
let searchBar: SearchBar
func body(content: Content) -> some View {
content
.overlay(
ViewControllerResolver { viewController in
viewController.navigationItem.searchController = self.searchBar.searchController
viewController.navigationController?.navigationBar.sizeToFit()
}
.frame(width: 0, height: 0)
)
}
}