wake-up-neo.net

UISearchBar, die von UISearchController in der Tabellenkopfansicht dargestellt wird, wird zu weit animiert, wenn sie aktiv ist

Ich verwende UISearchController, um eine Suchleiste in der Kopfansicht einer Tabellenansicht darzustellen:

...
self.searchController.hidesNavigationBarDuringPresentation = NO;            
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;
[self.searchController.searchBar sizeToFit];
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;

(Wenn die tableHeaderView-Eigenschaft zweimal gesetzt werden muss, da sich sonst die Kopfzeilenansicht mit der ersten Zeile überschneidet, c.f. ein paar Antworten zu S.O. )

So sieht es aus, wenn er inaktiv ist: Inactive search bar in correct position

Die Suchleiste sollte nur aktiv bleiben, wenn sie aktiv ist. Ich möchte nicht, dass sie nach oben verschoben wird, um die Navigationsleiste auszublenden. Es wird jedoch unerwartet nach unten animiert, sodass zwischen ihm und der Navigationsleiste ein Leerzeichen verbleibt: 

Screenshot showing search bar animated too far down

Hier ist ein Video einer seltsamen Suchleistenanimation

Wenn ich eine Suchleiste nur getrennt von UISearchController verwende, zeigt sie nicht das gleiche Verhalten, wenn sie aktiv wird. 

In meinem Präsentations-View-Controller habe ich self.definesPresentationContext = YES; und self.navigationController.navigationBar.translucent = YES;, und in IB ist keines der Kästchen "Kanten erweitern" aktiv (alles schien mögliche Dinge zu sein, die eine Suchpräsentation abwerfen könnten, vom Lesen herum). 

Weiß jemand, wie ich verhindern kann, dass sich die Suchleiste nach unten bewegt? 

55
Zoë Smith

Ok, also habe ich endlich eine Lösung für mich gefunden. Obwohl es mehr als wahrscheinlich ist, dass wir andere Dinge in unserem Code/Storyboard haben (deshalb ist es eine schwierige Frage zu beantworten), folgte ich größtenteils Apples Tutorial über UISearchController: ( https://developer.Apple.com) /library/ios/samplecode/TableSearch_UISearchController/Einführung/Intro.html )

Fast mein ganzer Code ist identisch mit dem ihres Codes, aber ich konnte die Suchleiste nicht dazu bringen, beim Klicken darauf zu springen. Ich habe also unter "undurchsichtigen Balken" nach der ursprünglichen Tabellenansicht und der Tabelle mit den Suchergebnissen in meinem Storyboard gesucht. Das hat die Suchleiste dazu gebracht zu stoppen.

Es gab jedoch eine letzte Frage, nämlich, dass die erste Zeile der Ergebnistabellenansicht von der Suchleiste ausgeblendet wurde. Um das zu beheben, fügte ich self.tableView.contentInset = UIEdgeInsetsMake(kHeightOfTableViewCells, 0, 0, 0); der viewDidLoad-Methode meiner Ergebnistabellenansicht hinzu. Voila!

27
Brian Sachetta

Alte Frage, aber ich konnte dieses Problem durch Einstellung lösen 

self.extendedLayoutIncludesOpaqueBars = YES;

auf meinem View Controller. Ich denke, dass ein Problem durch eine undurchsichtige Navigationsleiste verursacht wird, aber hidesNavigationBarDuringPresentation auf NO in Ihrem Suchcontroller gesetzt wird, was dazu führt, dass sich die Suchleiste beim Fokussieren falsch positioniert.

63
ppilone

Ich konnte verhindern, dass UISearchBar nach unten verschoben wird, indem ich die folgende Zeile aus meinem ViewController entferne: self.definesPresentationContext = YES; 

28
Piotr Tomasik

definePresentationContext = true

override func viewDidLoad() {
        super.viewDidLoad()

        searchController = UISearchController(searchResultsController: nil)
        searchController.searchResultsUpdater = self
        searchController.hidesNavigationBarDuringPresentation = false

        searchController.dimsBackgroundDuringPresentation = true
        searchController.searchBar.searchBarStyle = UISearchBarStyle.Prominent
        self.tableView.tableHeaderView = searchController.searchBar

        definesPresentationContext = true
19
Gleb

Ich bin dran. Dieses Problem hatte ich auch, als ich dem WWDC-Beispielcode folgte.

Ich habe festgestellt, dass die searchBar nicht sichtbar ist, wenn ich die scopeButtonTitles-Eigenschaft der searchBar nicht gesetzt habe. Bei näherer Betrachtung hatte es nur einen Rahmen von CGRectZero. Dies bedeutet, dass durch das Setzen der scopeButtonTitles der Rahmen hinter den Kulissen festgelegt wird. Wenn Sie also keine scopeButtonTitles anzeigen möchten, aber UISearchBar nicht auf eine bestimmte Höhe festcodieren müssen, setzen Sie die scopeButtonTitles auf ein leeres Array. 

self.searchController = UISearchController(searchResultsController: nil)
self.searchController.searchResultsUpdater = self
self.searchController.searchBar.scopeButtonTitles = []
self.tableView.tableHeaderView = self.searchController.searchBar

Wenn Sie die scopeButtonTitles auf ein Array aus 1 Zeichenfolgen setzen, werden die Titel der Bereichsschaltflächen nicht angezeigt, sie verfügen jedoch immer noch über eine Logik, um sich mit der Ansicht zu beschäftigen.

Requisiten an das QA-Team von Apple (gilt für iOS 8) 

15
Sozin's Comet

Ich bin vor kurzem auf dieses Problem gestoßen und keine der Lösungen hat für mich funktioniert. Vielleicht, weil meine Benutzeroberfläche komplexer ist (Meine Tabellensicht mit Suchunterstützung ist in UITabController in einem UiNavigationController enthalten), sowieso keiner der oben genannten Worker. UISearchController Navigationsleiste beim Drehen nicht erneut anzeigen

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar
{
    if (bar == searchController.searchBar) {
        return UIBarPositionTopAttached;
    }
    else { // Handle other cases
        return UIBarPositionAny;
    }
}

Noch etwas hinzuzufügen: Nachdem Sie die gesamte Hierarchie meines Controllers so festgelegt haben, dass sie unter undurchsichtigen und oberen Balken erweitert wird, wurde meine Suchleiste unter der Navigationsleiste ausgeblendet und wäre direkt nach einer Drehung angezeigt worden. Das war ein Hinweis für mich, dass es einen Layoutfehler gab und einige Informationen über mein Layout nicht stimmten. Diese Delegatenmethode hilft meinem Controller, die Situation in der ansonsten nomadisierten Suchleiste zu verstehen!

14
M. Porooshani

Fand es! Dies scheint die offensichtliche Linie in viewDidLoad des präsentierenden Vc zu sein: 

self.edgesForExtendedLayout = UIRectEdgeNone;

Wenn das entfernt wurde, blieb die Suchleiste wie erwartet erhalten. 

6
Zoë Smith

deaktivieren von Einblättern der Bildlaufansicht 

und

unter Top Bars prüfen

Problem mit behoben  enter image description here

4
Basil Mariano

setzen Sie für iOS 11 und Swift 4 die folgende Linie in viewController, um mein Problem zu beheben (searchBar-Sprung nach unten):

self.edgesForExtendedLayout = .bottom
2
side

Ich denke, Sie setzen UISearchBar frame.original.y = 64

es gibt den Code

if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
    [self setEdgesForExtendedLayout:UIRectEdgeNone];
}

searchBar.frame = CGRectMake(0, 0, 376, 44);

waschen kann dir helfen

1
Hawe

Wie im ersten Beitrag erwähnt, brauchte jeder eine andere Lösung. Also hier ist meins. Ich musste zwei Dinge auf dieser Seite kombinieren, nämlich:

Swift 2:

    navigationController?.navigationBar.translucent = true

    edgesForExtendedLayout = .None
0
hashier

Wenn Sie UINavigationController und TabBar verwenden, können Sie nicht verwenden:

self.extendedLayoutIncludesOpaqueBars = true

Sie benötigen diese Lösung: https://stackoverflow.com/a/46151063/3369381

0
demylia

In meinem Fall wurde das Problem durch Einstellen der Navigationsleiste auf self.navigationController.navigationBar.translucent = NO; behoben. Es scheint, dass die Präsentationsschicht der Suchleiste die Transluzenz der Navigationsleiste beim Anordnen der Suchleiste nicht berücksichtigt.

Mir ist klar, dass dies keine perfekte Lösung ist, weil die Transluzenz der Navigationsleiste das Layout an anderer Stelle abschütteln kann, aber es behebt zumindest das Problem, wenn eine nicht transparente Navigationsleiste möglich ist. 

0
Alex Medearis

es ist sehr einfach, tun Sie ClipsToBounds = true der Kopfansicht der Tabellenansicht in der Suchleiste hinzugefügt wird.

countryTableView.tableHeaderView?.clipsToBounds = true
0
Prit_Singh