2015-02-04 3 views
52

ich UISearchController bin mit einer Suchleiste in der Kopfansicht eines Tableview präsentieren:UISearchBar von UISearchController in Tabellenkopfansicht dargestellt beseelt zu weit, wenn sie aktiv

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

(wo die Einstellung die tableHeaderView Eigenschaft zweimal notwendig ist, wie sonst wird die Kopfsicht überlappt die erste Zeile, cf a couple of answers on S.O.)

Dies ist, wie es aussieht, perfekt in Position, wenn inaktiv: Inactive search bar in correct position

Die Suchleiste sollte nur dann aktiv bleiben, wenn sie aktiv ist. Ich möchte nicht, dass sie sich nach oben bewegt, um die Navigationsleiste auszublenden. Aber es beseelt unerwartet nach unten, einen leeren Raum zwischen ihm verlassen und der Navigationsleiste:

Screenshot showing search bar animated too far down

hier ein video of weird search bar animation

Wenn ich nur eine Suchleiste getrennt von UISearchController verwenden, ist es nicht das zeigen gleiches Verhalten, wenn es aktiv wird.

In meinem präsentierenden View-Controller habe ich self.definesPresentationContext = YES; und self.navigationController.navigationBar.translucent = YES;, und in IB sind keine der "extend edges" -Boxen aktiv (alles schien mögliche Dinge zu sein, die die Suchpräsentation ablenken könnten).

Weiß jemand, wie ich die Suchleiste davon abhalten kann, zu animieren?

+0

Ich habe das gleiche Problem. Ich habe versucht, Apples Beispielprojekt hier zu durchlaufen: https://developer.apple.com/library/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html aber immer noch kein Glück. Wird aktualisiert, wenn ich eine Antwort finde. –

+1

Keiner der Lösung funktionierte für mich: ( –

+0

Ihr Video-Link ist jetzt kaputt. – trapper

Antwort

26

Ok, also habe ich endlich eine Lösung für mich selbst gefunden. Obwohl es mehr als wahrscheinlich ist, haben wir andere Dinge in unserem Code/Storyboard (deshalb ist dies eine schwierige Frage zu beantworten), zum größten Teil folgte ich Apples Tutorial auf UISearchController:

Fast alle meine Code ist identisch mit denen, aber ich konnte nicht die Suchleiste nicht zu springen, wenn Sie in es klicken. Also habe ich "Under Opa Bars" für die ursprüngliche Tabellenansicht und die Suchergebnistabellenansicht in meinem Storyboard überprüft. Das brachte die Suchleiste dazu, aufzuhören zu springen.

Aber es gab ein letztes Problem, nämlich dass die erste Zeile der Ergebnistabelle durch die Suchleiste ausgeblendet wurde. Um das zu beheben, fügte ich self.tableView.contentInset = UIEdgeInsetsMake(kHeightOfTableViewCells, 0, 0, 0); zu der viewDidLoad Methode meiner Ergebnis-Tabellenansicht hinzu. Voila!

+0

Es sollte hier angemerkt werden, dass 'kHeightOfTableViewCells' eine Konstante ist, die ich in meiner Tabellensicht-Klasse gesetzt habe, um zu definieren, wie groß meine Zellen sind. –

+1

Ja, ich denke, das kommt irgendwo hin! - Siehe auch http://StackOverflow.com/a/19585104/2199136 –

+0

Unter undurchsichtigen Balken auf der View-Controller im Storyboard hat es für mich getan, danke! – c0d3Junk13

6

Es gefunden! Dies scheint in viewDidLoad der präsentierenden vc die Offensive Line zu sein:

self.edgesForExtendedLayout = UIRectEdgeNone; 

entfernt, dass und die Suchleiste blieb an Ort und Stelle, wie vorhergesagt.

+0

Das hat es nicht für mich getan, da ich diesen Code nicht in meinem Projekt habe. Ich habe versucht, ein anderes Beispielprojekt zu verwenden: https://github.com/dempseyatgithub/Sample-UISearchController und es Stück für Stück kaputt zu machen, aber immer noch kein Glück. Wird weiter suchen. –

+0

Hmm nervig! Sie können das kitchesForExtendedLayout auch auf dem View-Controller im Storyboard mit den Markierungsfeldern Kanten verlängern festlegen. Vielleicht überprüfen Sie diese? –

+0

Auch - ich bin auf seltsame Animationen von der Tatsache, dass UISearchController ist jetzt ein vollwertiges präsentiert VC - so zum Beispiel sah ich eine seltsame Entlassung Animation, wo die Suchleiste auf den Boden der VC fallen würde, wenn Abbrechen geklickt wurde . Dies war darauf zurückzuführen, dass der präsentierende VC einen Übergangskontext mit einem ausgewählten vertikalen Übergangstyp bereitstellt. Alles um zu sagen, dass ich, wenn ich ein bisschen besser verstehe, wie die Präsentationsmechanismen funktionieren, vielleicht in der Lage wäre, all diese Verrücktheit leichter zu debuggen ...! –

24

konnte ich UISearchBar, um zu verhindern, indem Sie die folgende Zeile aus meinem Viewcontroller Herunterschalten: self.definesPresentationContext = YES;

+3

Fabelhafte Antwort. Die Idee besteht darin, den Root-View-Controller zum Moderator des Such-Controllers zu machen, wenn mehrere Container-VCs im Mix vorhanden sind. Indem wir nicht setzen, greifen wir auf den Root-View-Controller zurück, der die heimtückischen Probleme gelöst hat, die von getrennten übergeordneten View-Controllern ausgehen. Vielen Dank! –

+0

Am Anfang funktionierte es. Aber später bemerkte ich, dass ich aufgrund dieses Fixes einen Absturz hatte: Wenn ich suche und es keine Ergebnisse gibt, hat das Tippen auf die Schaltfläche im Platzhalter zu einem Absturz vom Typ "kein Selektor" geführt - das Überspringen der Schaltfläche funktionierte nicht. Wahrscheinlich Besonderheiten meines Setups, aber sei vorsichtig. Die Kombination von 'self.definesPresentationContext = true' und' self.extendedLayoutIncludesOpaqueBars = true' funktionierte besser für meine Einrichtung. – Vitalii

15

dreht. Ich hatte dieses Problem auch, als ich dem Beispielcode der WWDC folgte.

Ich bemerkte, dass die SearchBar nicht sichtbar wäre, wenn ich die Eigenschaft scopeButtonTitles der searchBar nicht festgelegt hatte. Bei näherer Betrachtung hatte es nur einen Rahmen von CGRectZero. Das bedeutet, dass das Festlegen der scopeButtonTitles den Frame hinter den Kulissen festlegt.Wenn also keine scopeButtonTitles angezeigt werden sollen, aber die UISearchBar nicht auf eine bestimmte Höhe festgelegt werden soll, legen Sie scopeButtonTitles auf ein leeres Array fest.

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

Einstellen der scopeButtonTitles auf ein Array von 1 Strings werden die Bereichstaste Titel nicht angezeigt werden, aber immer noch Logik mit der Ansicht zu tun haben, im Wesentlichen um das Layout zu vermasseln.

Props Apples QA-Team (für iOS 8)

+0

Total genial. Funktioniert für meine Tabellenansicht mit benutzerdefiniertem Zeilenlayout auf iOS 8! –

+0

Wenn Sie ein leeres Array für das Oszilloskop festlegen, wird dieses Problem auf iOS8 definitiv behoben, wenn Sie einen benutzerdefinierten View-Controller und eine eigene Tabellen-/Sammlungsansicht verwenden. – Andrew

+0

Sie können 'sizeToFit' auch aufrufen, um das Problem der Nullgröße zu beheben. –

14

Ich lief vor kurzem für dieses Problem und keine der Lösungen für mich gearbeitet. Vielleicht, weil meine Benutzeroberfläche komplexer ist (meine Tabellenansicht mit der Suche unterstützt in UITabController in einem UiNavigationController enthalten), keiner der oben genannten Worker. konnte ich einfach mein Problem dieses sehr ordentlich Stück Code löse ich gefunden: UISearchController Not Redisplaying Navigation Bar on Rotate

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

Noch etwas hinzuzufügen: schließlich Hierarchie meines Controllers Einstellung unter undurchsichtigen und Top-Bars zu verlängern, mein Die Suchleiste erschien unter der Navigationsleiste ausgeblendet und wäre direkt nach einer Drehung angezeigt worden. Das war ein Stichwort für mich, dass es einen Lay-out-Fehler gibt und einige Informationen über mein Layout nicht richtig waren. Diese Delegate-Methode hilft meinem Controller, die Situation über die ansonsten nomadische Suchleiste zu verstehen!

0

In meinem Fall wurde das Problem durch Setzen der Navigationsleiste auf self.navigationController.navigationBar.translucent = NO; behoben. Es scheint, dass die Suchleisten-Darstellungsschicht die Transluzenz der Navigationsleiste nicht berücksichtigt, wenn die Suchleiste ausgelegt wird.

Mir ist klar, dass dies keine perfekte Lösung ist, weil die Transluzenz der Navigationsleiste das Layout anderswo wegwerfen kann, aber es behebt das Problem zumindest dann, wenn eine nicht durchscheinende Navigationsleiste möglich ist.

57

alte Frage, aber ich war in der Lage, dieses Problem zu lösen, indem

self.extendedLayoutIncludesOpaqueBars = YES;

auf meinem Ansicht-Controller einstellen. Ich glaube, das Problem wird durch eine undurchsichtige Navigationsleiste verursacht, die aber hidesNavigationBarDuringPresentation auf NO auf Ihrem Such-Controller setzt, was dazu führt, dass sich die Suchleiste beim Fokussieren falsch positioniert.

+1

Das hat bei mir funktioniert. Vielen Dank. – dnstevenson

+0

'public var extendedLayoutIncludesOpaqueBars: Bool // Standardeinstellung ist NO, aber Balken sind standardmäßig auf 7_0 abgeblendet. Also ich denke wirklich, Apple sollte standardmäßig auf JA setzen, da iOS7 – dOM

+0

Dies funktioniert. Sieht so aus, als ob die anderen Lösungen ein Workaround sind. –

16

definesPresentationContext = 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 
+0

Danke, mein Herr !. Du hast meinen Tag gerettet!!! –

+0

Ich Toooooo! Das '' 'definesPresentationContext = true''' ist das Leben! – Grifas

1

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

gibt es den Code

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

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

waschen Sie

+0

Das funktioniert für mich. Danke vielmals. –

0

erwähnt helfen kann, wie in der f Erster Beitrag jeder brauchte eine andere Lösung. Also hier ist meiner.Ich hatte zwei Dinge auf dieser Seite erwähnt zu kombinieren, und zwar:

Swift 2:

navigationController?.navigationBar.translucent = true 

    edgesForExtendedLayout = .None 
2

unchecking einstellen Scroll Ansicht Insets

und

Unter Top Bars Überprüfung

Behoben mein problem enter image description here

+0

danke mann! Nach vielen Grabarbeiten ist dies die einzige Lösung, die für mich funktioniert hat. Prost!! Du hast meinen Tag gerettet –

+0

du bist willkommen –

0

es ist sehr einfach tun nur clipsToBounds = true der Header-Ansicht der Tabellenansicht, in der Suchleiste hinzugefügt wird.

countryTableView.tableHeaderView?.clipsToBounds = true 
0

für iOS 11 & swift 4, stellen Sie die Linie unten in der ViewController gelöst mein Problem (searchBar jump down):

self.edgesForExtendedLayout = .bottom 
Verwandte Themen