webentwicklung-frage-antwort-db.com.de

iOS 11-Suchleiste in der Navigationsleiste

Unter iOS 11 hat Apple die UISearchBar überarbeitet, indem die Ecken abgerundet und die Höhe vergrößert wurden. Das Hinzufügen einer UISearchBar zur Navigationsleiste ist recht einfach, indem Sie sie einfach mit navigationItem.titleView = searchBar.

In iOS 11 scheint es jedoch nicht mehr wie erwartet zu funktionieren. Schauen Sie sich die Bildschirme an, auf denen wir das gleiche Setup mit iOS 10 und iOS 11 vergleichen

iOS 10 enter image description here

iOS 11 enter image description here

Sie können deutlich sehen, dass die Suchleiste die Navigationsleiste vergrößert, die Leistenschaltflächen jedoch nicht richtig ausgerichtet sind. Auch die searchBar verwendet nicht mehr den verfügbaren Platz auf der linken Seite.

Die searchBar in eine Wrapper-Ansicht bringen, um die Abbrechen-Schaltfläche auf dem iPad zu erhalten, wie hier beschrieben Die Abbrechen-Schaltfläche wird in der UISearchBar nicht angezeigt funktioniert auch nicht mehr, da die searchBar dann überhaupt nicht sichtbar ist.

Wenn jemand ähnliche Probleme hat oder bereits weiß, wie dies behoben/verbessert werden kann, wäre ich sehr dankbar.

Dies wurde mit Xcode 9 Beta 4 erstellt. Möglicherweise werden zukünftige Versionen dieses Problem beheben.

UPDATE:

Da dies nicht behoben wird, haben wir uns für die folgende Lösung entschieden. Wir haben der NavBar ein neues UIBarButtonItem hinzugefügt, das dann einen neuen ViewController präsentiert, in dem wir nur eine searchBar und sonst nichts in die NavBar zu stellen, was zu funktionieren scheint. Die ausgewählte Antwort ist möglicherweise die beste Lösung, da Apple mit iOS 11 möchte, dass wir dieses neue Design verwenden, auch wenn es nicht das ursprünglich gewünschte Ergebnis liefert. Ein anderer Weg, dies zu lösen, könnte sein Sei eine benutzerdefinierte Suchleiste, aber dies ist ein anderes Thema.

69
PatrickDotStar

Es gibt eine neue searchController-Eigenschaft für navigationItem in iOS 11.

https://developer.Apple.com/documentation/uikit/uinavigationitem/2897305-searchcontroller

Verwenden Sie wie folgt ...

if #available(iOS 11.0, *) {
     navigationItem.searchController = searchController
} else {
     // Fallback on earlier versions
     navigationItem.titleView = searchController?.searchBar
}

In Objective-C sieht die if-Anweisung folgendermaßen aus:

if (@available(iOS 11.0, *)) {

Wenn Sie unter iOS 11 nicht navigationItem.hidesSearchBarWhenScrolling = false Festlegen, wird die Suchleiste möglicherweise zunächst ausgeblendet, es sei denn, der Benutzer führt einen Bildlauf nach unten durch, um sie anzuzeigen. Wenn Sie es auf false setzen, wird es gestapelt unter dem Titel angezeigt, ohne dass der Benutzer einen Bildlauf durchführen muss.

51
Justin Domnitz

Sie können die Höhe von UISearchBar in iOS 11 ändern, indem Sie eine Einschränkung der Höhe 44 hinzufügen:

if #available(iOS 11.0, *) {
    searchBar.heightAnchor.constraint(equalToConstant: 44.0).isActive = true
}
16
zgjie

Ich hatte das gleiche Problem und fand diese Seite nach ein paar Tagen googeln - https://translate.google.com/translate?hl=de&sl=zh-CN&u=http://www. jianshu.com/p/262f6e34a7d3&prev=search .

Diese Seite führt zu diesem Git-Repo - https://github.com/DreamTravelingLight/searchBarDemo - Dieses Demo-Projekt zeigt, wie man die alte Methode mit titleView verwendet, um immer noch eine SearchBar ohne Größenproblem zu haben.

Die wichtigsten Zeilen sind diese

_searchBar = [self addSearchBarWithFrame:CGRectMake(0, 0, kScreenWidth - 2 * 44 - 2 * 15, 44)];
UIView *wrapView = [[UIView alloc] initWithFrame:_searchBar.frame];
[wrapView addSubview:_searchBar];
self.navigationItem.titleView = wrapView;

Wenn Sie die UISearchBar in eine Ansicht einbetten und diese WrapView als TitleView festlegen, hat die UISearchBar die von Ihnen festgelegte Größe und passt wie vorgesehen zur Navigationsleiste.

Danke, David

4
David Schechter

Das hat mir geholfen:

    if ([self.navigationItem respondsToSelector:@selector(setSearchController:)])
    {
        [self.navigationItem performSelector:@selector(setSearchController:) withObject:self.searchController];
    }
    else
    {
        self.tableView.tableHeaderView = self.searchController.searchBar;
    }
1
Raunak

Wenn Sie wirklich das native UISearchBar verwenden möchten (und die Notwendigkeit vermeiden möchten, Ihre benutzerdefinierten Komponenten zu erstellen) in iOS 11+ navigationBar, Sie können eine Containeransicht für searchBar erstellen, um die volle Kontrolle über den Frame zu haben. Diese Containeransicht ist die Übersicht über das searchBar, das Sie übergeben.

Etwas wie:

class SearchBarContainerView: UIView {

    let searchBar: UISearchBar

    required init?(coder aDecoder: NSCoder) {
        searchBar = UISearchBar()
        super.init(coder: aDecoder)
    }

    init(searchBar: UISearchBar) {
        self.searchBar = searchBar
        super.init(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 44.0))
        addSubview(searchBar)
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        searchBar.frame = bounds
    }
}

nd dann:

let containerView = SearchBarContainerView(searchBar: searchController.searchBar)
containerView.frame.size.width = navigationController?.navigationBar.frame.size.width ?? 0.0
navigationItem.titleView = containerView

Hinweis Dies ist nur eine kurze Demo und nicht bereit für navigationBar Frame-Änderungen (Anzeigedrehung usw.). Sie könnten das mit z. autoresizingMask.

1
Jakub Truhlář

Ich denke, Sie müssen sich mit dem Setzen der neuen UINavigationItem.searchController-Eigenschaft auf Ihr UISearchController-Objekt befassen. Auf diese Weise erhalten Sie den neuen Effekt, der in Nachrichten angezeigt wird. Es sieht so aus, als ob das alte Verhalten einfach weg ist. Ich hoffe, ich habe mich geirrt, aber die gesamte API wurde für 11 überarbeitet. Ich weiß, dass sie im Allgemeinen fehlerhaft ist, also werden wir mit neueren Betas und dem GM sehen, ob dies behoben wird. (Writing zum Zeitpunkt der Beta 6)

1
cook