Zoekbalk in navigatiebalk weergeven zonder te scrollen op iOS 11

Ik koppel een UISearchController aan de eigenschap navigationItem.searchControllervan 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?

voer hier de afbeeldingsbeschrijving in
voer hier de afbeeldingsbeschrijving in

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 hidesSearchBarWhenScrollingvan 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 isActivedeed 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 isActiveinstellen op truenadat 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)
            )
    }
}

Other episodes