Suchleiste in der Navigationsleiste anzeigen, ohne unter iOS 11 zu scrollen

79

Ich hänge einen UISearchController an die navigationItem.searchControllerEigenschaft eines UITableViewController unter iOS 11 an. Dies funktioniert einwandfrei: Ich kann die schöne Suchleiste im iOS 11-Stil verwenden.

Ich möchte jedoch die Suchleiste beim Start sichtbar machen. Standardmäßig muss der Benutzer in der Tabellenansicht nach oben scrollen, um die Suchleiste anzuzeigen. Weiß jemand, wie das möglich ist?

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Links: Standardsituation nach dem Start. Rechts: Suchleiste sichtbar gemacht (durch Scrollen nach oben). Ich möchte, dass die Suchleiste nach dem Start wie im rechten Screenshot sichtbar ist.

Ich habe bereits festgestellt, dass die Suchleiste sichtbar gemacht werden kann, indem die Eigenschaft hidesSearchBarWhenScrollingmeines Navigationselements auf false gesetzt wird. Dies führt jedoch dazu, dass die Suchleiste immer sichtbar ist - auch wenn Sie nach unten scrollen -, was ich nicht möchte.

Jonathan
quelle
in wo Sie den Code hinzugefügt habenhidesSearchBarWhenScrolling
Anbu.Karthik
1
Was ist mit s als s firstResponder?
Milan Nosáľ
2
Die unten ausgewählte Antwort funktioniert beim Laden für mich, aber ich möchte den Search Controller auch erneut anzeigen, wenn Sie programmgesteuert mit nach oben scrollen scrollView.setContentOffset(_:animated). Hat jemand einen Vorschlag?
Justin Vallely
@Jonathan hidesSearchBarWhenScrolling = falsesetzt die Suchleiste in iOS 13 über einen großen Titel. Irgendeine Idee, ob ich das irgendwie aktualisieren kann?
Bonnke

Antworten:

185

Im Folgenden wird die Suchleiste zuerst sichtbar und beim Scrollen ausgeblendet:

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
    }
}

Wenn Sie isActivenicht das getan haben, was ich wollte, wird die Suchleiste aktiviert (mit der Schaltfläche "Abbrechen" usw.), wenn ich nur möchte, dass sie sichtbar ist.

Jordan Wood
quelle
Danke, hat für mich gearbeitet. Interessante Lösung aber :)
Mikrasya
9
Diese Lösung funktioniert, aber es gibt Nebenwirkungen, wenn Sie auch eine Navigationsleiste anzeigen, wenn diese zuvor ausgeblendet war (dh diese Ansicht mit Suchleiste auf den Navigationsstapel schieben). Die Suchleiste wird statisch angezeigt, wenn die Navigationsleiste animiert wird. Sieht schrecklich aus :(
Matthew Crenshaw
11
Nicht, wenn Sie den ersten Teil viewDidLoadanstelle vonviewWillAppear
Marc-Alexandre Bérubé
1
Kann jemand bitte erläutern, warum dies funktioniert und warum dies searchController.searchBar.isHidden = falsein viewDidLoad nicht der Fall ist? Letzteres erscheint mir weitaus logischer
pho_pho
5
Dies führt zu visuellen Fehlern in iOS 13 beim Zurückkehren vom untergeordneten Bildschirm.
Nemissm
5

Sie können die Eigenschaft isActiveauf truefestlegen, nachdem Sie den searchController zum hinzugefügt haben navigationItem.

Genau wie dieser:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    searchController.isActive = true
}
txaidw
quelle
Keine Setter-Methode 'setIsActive:'
Nikolay Krasnov
Du hast recht, @NikolayKrasnov. isActiveist ein schreibgeschützter Boolescher Wert. Sie möchten searchController.active = truestattdessen verwenden.
Mark Jeschke
2

Bei mir hat es funktioniert, nachdem ich folgende Zeilen in die viewDidLoad()Methode eingefügt habe:

navigationController?.navigationBar.prefersLargeTitles = true
navigationController!.navigationBar.sizeToFit()
Rohit
quelle
0

Unter iOS 13 funktionierte die Antwort von @Jordan Wood nicht. Stattdessen habe ich:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    UIView.performWithoutAnimation {
        searchController.isActive = true
        searchController.isActive = false
    }
}
GaétanZ
quelle