2013-10-13 6 views
6

Ich habe eine iOS 7-Anwendung in XCode 5.0, die seltsames Verhalten zeigt beim Tippen auf die Suchleiste (UISearchBar).Aktivieren Suchleiste nicht Navigationsleiste

Meine Anwendung verfügt über einen Navigationscontroller und einen Tab Bar Controller. Hier ist ein Beispiel dafür, was meine Main.Storyboard wie folgt aussieht:

[Navigation Controller] -> [Tab Bar Controller] -> [Tab Item #1] 
            | 
            -------------> [Tab Item #2] 

Each [] is a view controller 

Wenn ich meine Anwendung starten, ich sehe die Tab Item 1 mit den UISearchBar wie im Screenshot unten gezeigt:

one

Wenn Ich tippe auf UISearchBar, die Suchleiste wird an den oberen Bildschirmrand verschoben, aber die Navigationsleiste wird nicht ausgeblendet, und die Ansicht wird nicht nach oben verschoben. Dies bewirkt, dass die App wie folgt aussehen:

two

Als ich die Tab Bar Controller aus dem Storyboard löschen und die Navigation Controller direkt an Tab Item #1 die Navigationsleiste versteckt verbinden, wie erwartet.

Wie kann ich die Navigationsleiste ausblenden, wenn Sie auf die Suchleiste tippen? Um ein Beispiel für die Funktionalität zu erhalten, die ich reproduzieren möchte, klicken Sie auf die Suchleiste unter der Registerkarte "Kontakte" der Standardanwendung "Phone" von iOS7.

+1

Möchten Sie wirklich, dass der Navigationscontroller den Tab-Bar-Controller enthält? Im Allgemeinen ist es umgekehrt. –

+0

@nevanking - Ich hatte versucht, es anders zu machen und ich konnte es nicht zur Arbeit bringen. Die Navigationsleiste sollte die gesamte Anwendung umfassen, nicht nur die Ansicht "Tab Item # 1". Was ist der Grund dafür, umgekehrt zu wechseln? – Ian

+1

Es ist nur der normale Weg, es zu tun. Sehen Sie sich die Musik-App oder die Uhr-App an. Sie könnten daran denken, jedem Register einen eigenen Navigationscontroller zu geben, der dann den Content-View-Controller enthält. –

Antwort

4

Sie können die UISearchBar-Delegatmethoden verwenden, um zu entscheiden, wann die Navigationsleiste aus dem Bildschirm verschoben werden soll.

-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{ 
    [UIView animateWithDuration:0.2 animations:^{ 
     CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame]; 
     double yDiff = self.navigationController.navigationBar.frame.origin.y - self.navigationController.navigationBar.frame.size.height - statusBarFrame.size.height; 
     self.navigationController.navigationBar.frame = CGRectMake(0, yDiff, 320, self.navigationController.navigationBar.frame.size.height); 
    }]; 

} 

-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{ 
    [UIView animateWithDuration:0.2 animations:^{ 
     CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame]; 
     double yDiff = self.navigationController.navigationBar.frame.origin.y + self.navigationController.navigationBar.frame.size.height + statusBarFrame.size.height; 
     self.navigationController.navigationBar.frame = CGRectMake(0, yDiff, 320, self.navigationController.navigationBar.frame.size.height); 
    }]; 
} 
+0

Wie kann ich das in swift tun? – mumu

1

Sie können es mit UISearchDisplayController-Methode tun;

-(void)searchDisplayControllerWillBeginSearch:(mySearchDisplayController *)controller 
{ 
    self.searchResultsDataSource = self; 
    self.searchResultsTableView.delegate = self; 
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) 
    { 
     CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame]; 
     [UIView animateWithDuration:0.01 animations:^{ 
      for (UIView *subview in self.searchBar.subviews) 
       subview.transform = CGAffineTransformMakeTranslation(0, statusBarFrame.size.height); 
     }]; 
    } 
} 

-(void)searchDisplayControllerWillEndSearch:(mySearchDisplayController *)controller 
{ 
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) 
    { 
     [UIView animateWithDuration:0.01 animations:^{ 
      for (UIView *subview in self.searchBar.subviews) 
       subview.transform = CGAffineTransformIdentity; 
     }]; 
    } 
} 

Vergessen Sie nicht, eine neue Klasse als eine Art UISearchDisplayController erstellen und diesen Code in es umzusetzen.

+0

Auch sollten Sie das http://stackoverflow.com/questions/19932192/issue-with-uisearchbar-and-uitableview-in-ios7/20091672#20091672 sehen wollen –

2

Sie können die obere Leiste in der Navigation-Controller für die Liste, auf none gesetzt und dann diesen Code auf Ihre TabBarController hinzu:

self.navigationController.navigationBar.translucent= NO; 

Im viewDidLoad Methode

-1

Ich weiß, dass dies wahrscheinlich zu spät, um Ihnen zu helfen, aber ich stieß heute auf das gleiche Problem!

Ich löste es durch die Festsetzung der Einschränkungen der Suchleiste. Stellen Sie sicher, dass die Suchleiste eine Einschränkung von 0 px für den unmittelbaren oberen Nachbarn (die Navigationsleiste) hat. Stellen Sie außerdem sicher, dass die Tabellenansicht unterhalb der Suchleiste für den unmittelbaren oberen Nachbarn (die Suchleiste) eine Einschränkung von 0 Pixeln aufweist.

Nicht sicher über das genaue Problem, das Sie konfrontiert wurden, aber das hat es für mich behoben.

-1

Ich löste das Problem, indem ich der TopLayout-Anleitung eine Einschränkung für die Suchleiste hinzufügte und den Wert auf 0 setzte und der Suchleiste eine Einschränkung für den vertikalen Abstand hinzufügte und den Wert auf 0 einstellte;

3

Für swift Entwickler:

func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { 

    navigationController?.setNavigationBarHidden(true, animated: true) 

} 

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) { 

    navigationController?.setNavigationBarHidden(false, animated: true) 

} 

Dies wird die Navigationsleiste ausblenden, während Suchleiste aktiv ist und es wieder zeigen, wenn Suchleiste inaktiv ist.